<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel xmlns:atom="http://www.w3.org/2005/Atom"><title>DanylkoWeb - Latest Posts</title><link>https://www.danylkoweb.com/RSS</link><description>ASP.NET Web Development for Developers and Designers</description><lastBuildDate>Tue, 14 Apr 2026 21:36:51 -0700</lastBuildDate><atom:link href="https://www.danylkoweb.com/blog/rss" rel="self" type="application/rss+xml" /><item><guid isPermaLink="false">8db843a9-0bd0-4b14-863b-c941b468cadc</guid><link>https://www.danylkoweb.com/Blog/stir-trek-2025-UI</link><title>Stir Trek 2025</title><description>&lt;p&gt;By Jonathan "JD" Danylko&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Stir Trek happened last week and is one of the best conferences in the MidWest so let's review the event&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/st-2025-breakfast.jpg" alt="Large number of people at Stir Trek 2025" title="Great turnout at Stir Trek 2025" class="img-fluid no-float" width="640" height="427" /&gt;&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;Past Reviews&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/stir-trek-2023-edition-T4" title="Go to Stir Trek 2023"&gt;Stir Trek 2023&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/review-stir-trek-2019-GN" title="Go to Review: Stir Trek 2019"&gt;Review: Stir Trek 2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stir Trek 2018 (&lt;a href="https://www.danylkoweb.com/Blog/stir-trek-2018-part-1-KH" title="Go to Stir Trek 2018, Part 1"&gt;Part 1&lt;/a&gt;, &lt;a href="https://www.danylkoweb.com/Blog/stir-trek-2018-part-2-ML" title="Go to Stir Trek 2018, Part 2"&gt;Part 2&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/stir-trek-2017-JL" title="Go to Stir Trek 2017"&gt;Stir Trek 2017&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Considered as one of the best conferences in the MidWest, Stir Trek was on Friday, May 2&lt;sup&gt;nd&lt;/sup&gt; and gave the tech community an absolutely fantastic experience, as always!&lt;/p&gt;
&lt;h2&gt;What is Stir Trek?&lt;/h2&gt;
&lt;p&gt;Stir Trek is a one-day conference held at the AMC Dine-In Easton Town Center 30 in Columbus, Ohio every year at the beginning of May and focuses on multiple sessions during the day.&lt;/p&gt;
&lt;p&gt;What makes this conference different from others? At the end of the day when sessions finish, attendees are treated to a blockbuster movie. This year...THUNDERBOLTS!&lt;/p&gt;
&lt;h2&gt;(Personal) Agenda&lt;/h2&gt;
&lt;p&gt;The conference started early and provided breakfast for all attendees ranging from donuts, fruit, and, of course, coffee.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/st-2025-breakfast-2.jpg" alt="Breakfast being served at Stir Trek 2025" title="Breakfast being served at Stir Trek 2025" class="img-fluid no-float" width="640" /&gt;&lt;/p&gt;
&lt;p&gt;After grabbing some breakfast and meeting some old (and new) friends, the sessions kicked off at 8:30a.&lt;/p&gt;
&lt;h3&gt;8:30a - Intro to OpenTelemetry for Developers&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;AL Rodriguez / &lt;a href="https://x.com/programmerAl" title="Go to AL Rodriguez on x.com"&gt;@programmerAL&lt;/a&gt;&amp;nbsp;/ &lt;a href="https://programmeral.com/posts/20250502_StirTrek2025" title="Go to Stir Trek 2025 Post on programmerAL.com"&gt;Slides&lt;/a&gt; / &lt;a href="https://github.com/ProgrammerAL/Presentations-2025/tree/main/stir-trek" title="Go to OTel Demo on github.com"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/st-2025-rodriguez.jpg" alt="AL Rodriguez with his session on OpenTelemetry" title="AL Rodriguez with his session on OpenTelemetry" class="img-fluid no-float" width="640" height="387" /&gt;&lt;/p&gt;
&lt;p&gt;One of the technologies I wanted to dig into further this year is OpenTelemetry (OTel) for integrating into &lt;a href="https://www.danylkoweb.com/tuxboard" title="Go to Tuxboard"&gt;Tuxboard&lt;/a&gt; for analytics. How convenient that it was the first session of the day.&lt;/p&gt;
&lt;p&gt;OpenTelemetry is meant to gaze into a system's specific function and identify whether it's working as expected or not.&lt;/p&gt;
&lt;p&gt;Mr. Rodriguez opened with what OpenTelemetry is, how observability plays into it, and how it's different from creating logs.&lt;/p&gt;
&lt;p&gt;He proceeded to explain how Azure Application Insights SDK allows out-of-the-box OpenTelemetry like HTTP Requests and Requests Per Second (RPS) and all of the specifics of OpenTelemetry including the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tracing - Lifetime of requests throughout the system using Spans&lt;/li&gt;
&lt;li&gt;Metrics - Counters, CPU Usage/Memory, Requests per Second, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, I liked the presentation/code ratio. He presented fundamentals of OTel while showing code to demonstrate a working example.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;9:30a - Building Asynchronous UIs Without the Hassle&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Dev Agrawal / &lt;a href="https://x.com/devagrawal09" title="Go to Dev Agrawal on x.com"&gt;@devagrawal09&lt;/a&gt; / &lt;a href="https://devagr.me/" title="Go to devagr.me"&gt;Website&lt;/a&gt; / &lt;a href="https://www.youtube.com/watch?v=pX5r_jTLbvw" title="Go to Building Asynchronous UIs Without the Hassle (Codemash 2025) on youtube.com"&gt;Video&lt;/a&gt; (from Codemash 2025)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/st-2025-agrawal.jpg" alt="Dev Agrawal with his session on Building Asynchronous UIs Without the Hassle" title="Dev Agrawal" class="img-fluid no-float" width="640" height="368" /&gt;&lt;/p&gt;
&lt;p&gt;In case you missed Dev's presentation at Codemash, this was another chance to see it.&lt;/p&gt;
&lt;p&gt;Dev's message was "asynchronous state is complex," but using Suspense with React made it easier to work with in the long run.&lt;/p&gt;
&lt;p&gt;While I'm not a React developer, I was enticed by the JavaScript and UI aspect of the talk. Throughout the presentation, Dev gave demonstrations of an asynchronous application and user interface (UI) issues as a user.&lt;/p&gt;
&lt;p&gt;Dev approaches his presentation by walking the audience through certain UI issues and applies code techniques to properly use asynchronous methods while providing loading messages for the user.&lt;/p&gt;
&lt;p&gt;Dev presented a good understanding of how to resolve asynchronous issues by using Suspense with loading messages and how to avoid race conditions.&lt;/p&gt;
&lt;p&gt;Again, even though I'm not a React developer, I found the talk very interesting with ways to provide user feedback using asynchronous UI methods and best practices.&lt;/p&gt;
&lt;h3&gt;10:30a - Asynchronous JavaScript: Livin' On A Prayer&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Bob Fornal / &lt;a href="https://x.com/rfornal" title="Go to Bob Fornal on x.com"&gt;@rfornal&lt;/a&gt;&amp;nbsp;/ &lt;a href="https://github.com/bob-fornal" title="Go to Bob Fornal on github.com"&gt;Github&lt;/a&gt; / &lt;a href="https://dev.to/rfornal" title="Go to Bob Fornal on dev.to"&gt;Website&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/st-2025-fornal.jpg" alt="Bob Fornal with his session on Asynchronous JavaScript" title="Bob Fornal with his session on Asynchronous JavaScript" class="img-fluid no-float" width="640" height="480" /&gt;&lt;/p&gt;
&lt;p&gt;Keeping with the JavaScript and asynchronous topic, I decided to attend Mr. Fornal's talk.&lt;/p&gt;
&lt;p&gt;His talk was code-heavy and provided a number of examples and explained each one in detail so beginners and even seasoned developers could understand what was happening.&lt;/p&gt;
&lt;p&gt;One topic I thought was interesting was how he explained how setTimeout was strictly synchronous. Again, he had examples to demonstrate it.&lt;/p&gt;
&lt;p&gt;I'm hoping there is a video of his talk because there was a lot of helpful techniques and tips for JavaScript developers.&lt;/p&gt;
&lt;h3&gt;11:30a - Aspireify: Building and Deploying with .NET Aspire on Azure&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Jeffrey T. Fritz / &lt;a href="https://x.com/csharpfritz?ref=danylkoweb" title="Go to csharpfritz on x.com"&gt;@csharpfritz&lt;/a&gt; / &lt;a href="https://www.youtube.com/watch?v=74NGPmWlWZk" title="Go to Aspireify: Building and Deploying with .NET Aspire on Azure on youtube.com"&gt;Video&lt;/a&gt; / &lt;a href="https://jeffreyfritz.com/?ref=danylkoweb" title="Go to JeffreyFritz.com"&gt;Website&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/st-2025-fritz.jpg" alt="Jeffrey T. Fritz with his session on Aspireify" title="Jeffrey T. Fritz with his session on Aspireify" class="img-fluid no-float" width="640" height="457" /&gt;&lt;/p&gt;
&lt;p&gt;Mr. Fritz doesn't disappoint when presenting whether it's a presentation, coding on his &lt;a href="https://www.twitch.tv/csharpfritz" title="Go to csharpfritz on Twitch.tv"&gt;Twitch channel&lt;/a&gt;, or on a podcast. His Blazor and Aspire content is spot on and I urge you to check it out.&lt;/p&gt;
&lt;p&gt;For his presentation, he mentions his website called &lt;a href="https://aspireify.net/?ref=danylkoweb" title="Go to Aspireify.net"&gt;Aspireify.net&lt;/a&gt;. Not only was it created with .NET Aspire, it's considered a learning resource for how to build websites using Aspire.&lt;/p&gt;
&lt;p&gt;The first part of his talk was explaining techniques he used to build Aspireify.net like using Redis cache, Azure blob storage, and Azure queues. The best part about Aspire is the amount of abstraction to quickly create websites.&lt;/p&gt;
&lt;p&gt;Jeff gave some great tips and techniques for running Aspire websites.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use extension methods to provide a clean Program.cs&lt;/li&gt;
&lt;li&gt;Consider using const to avoid magic strings&lt;/li&gt;
&lt;li&gt;Schedule a time to clean up containers left over from building and testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;His tour of the site through code and the dashboard was a great introduction into how Aspire works. The Resources running is one of the best features of Aspire.&lt;/p&gt;
&lt;p&gt;The second part of his talk was the deploying of code to Azure using the following commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd pipeline config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd up&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even though these are simple commands, there's some additional configuration required to make certain assumptions when it comes to builds and using containers.&lt;/p&gt;
&lt;p&gt;The session was well-balanced between code and presentation. Great presentation, Jeff.&lt;/p&gt;
&lt;h3&gt;12:15p - Lunch&lt;/h3&gt;
&lt;p&gt;The amount of "bento boxes" for everyone was astounding: Turkey, Ham, or Roast Beef sandwiches with chips and a cookie.&lt;/p&gt;
&lt;p&gt;If you were looking for a drink, there were large coolers containing cans of Coke, Diet Coke, Sprite, and bottles of water available at any time.&lt;/p&gt;
&lt;p&gt;With everyone in line and grabbing their favorite sandwich, everyone had a duration of 30-45min to eat and move on to their next session.&lt;/p&gt;
&lt;h3&gt;1:00p - The Immutable Laws of Software and Life: Code Accordingly&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Cory House / &lt;a href="https://x.com/housecor" title="Go to Cory House on x.com"&gt;@housecor&lt;/a&gt; / &lt;a href="https://bit.ly/laws-software-life" title="Go to The Immutable Laws of Software and Life: Code Accordingly on bit.ly"&gt;Slides&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/st-2025-house.jpg" alt="Cory House with his session on Immutable Laws and how to Code Accordingly" title="Cory House with his session on Immutable Laws and how to Code Accordingly" class="img-fluid no-float" width="640" height="343" /&gt;&lt;/p&gt;
&lt;p&gt;I initially saw Cory House speak at Codemash and have enjoyed his presentations ever since.&lt;/p&gt;
&lt;p&gt;His talk mentions (almost) all of the technology laws learned over the years. Some of these laws include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shipley's Six Dimensions; can also be boiled down to the Iron Triangle (Good, Fast, Cheap)
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Brevity of code&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Featurefulness&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Speed of execution&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Time spent coding&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Robustness&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Flexibility&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Conway's Law - Organizations are constrained to produce designs which copies the communication structures of the organizations; Emphasizes the need to break down silos&lt;/li&gt;
&lt;li&gt;Hick's Law - The more stimuli (or choices) users face, the longer it will take them to make a decision&lt;/li&gt;
&lt;li&gt;The Fairbairn Threshold - The point at which the effort of looking up or keeping track of the definition is outweighed by the effort of rederiving it or inlining it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, there were more laws during the session.&lt;/p&gt;
&lt;p&gt;One of Cory's strengths in presenting is his ability to relax and interact with the audience.&lt;/p&gt;
&lt;p&gt;THIS is what makes his talks interesting and entertaining.&lt;/p&gt;
&lt;h3&gt;2:00p - Everything You Wanted to Know About Containers But Were Afraid To Ask&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Daniel Mikusa / &lt;a href="https://twitter.com/dmikusa" title="Go to Dan Mikusa on x.com"&gt;@dmikusa&lt;/a&gt; / &lt;a href="https://mikusa.com/" title="Go to Dan Mikusa's website on mikusa.com"&gt;Website&lt;/a&gt; / &lt;a href="https://github.com/dmikusa" title="Go to Dan Mikusa's Github on github.com"&gt;Github&lt;/a&gt; / &lt;a href="https://github.com/dmikusa/everything-about-containers" title="Go to Everything you wanted to know about containers but were afraid to ask on github.com"&gt;Slides&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/st-2025-mikusa.jpg" alt="Daniel Mikusa with his session on Everything containers, but were afraid to ask" title="Daniel Mikusa with his session on Everything containers, but were afraid to ask" class="img-fluid no-float" width="640" height="250" /&gt;&lt;/p&gt;
&lt;p&gt;Dan's session gave everyone a glimpse into what containers are, what they can do, and how to use them effectively.&lt;/p&gt;
&lt;p&gt;As mentioned in his talk, containers are everywhere and used for development (and deployment) purposes. However, there are pros and cons to using containers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cheap/Fast&lt;/li&gt;
&lt;li&gt;Easy way to package code&lt;/li&gt;
&lt;li&gt;Ubiquitous and battle-tested&lt;/li&gt;
&lt;li&gt;Strong tooling and Libraries&lt;/li&gt;
&lt;li&gt;Standardized&lt;/li&gt;
&lt;li&gt;Efficient distribution protocol&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Weaker isolation&lt;/li&gt;
&lt;li&gt;Container Security Config&lt;/li&gt;
&lt;li&gt;CPU shares are challenging&lt;/li&gt;
&lt;li&gt;Noisy Neighbors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;He explained how containers use layers, image hashes, volume mounts, and configuration files.&lt;/p&gt;
&lt;p&gt;I liked his approach to discussing the technology and terminology and then showing configurations/setup for the containers.&lt;/p&gt;
&lt;p&gt;Daniel's presentation was solid and gave everyone a better understanding of containers.&lt;/p&gt;
&lt;h3&gt;3:00p - Hot New HTML Features&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Alex Riviere / &lt;a href="https://alex.party/" title="Go to Alex.Party"&gt;Website&lt;/a&gt; / &lt;a href="https://slides.com/fimion/stirtrek-2025" title="Go to Hot New HTML Features on slides.com"&gt;Slides&lt;/a&gt; / &lt;a href="https://github.com/fimion" title="Go to Fimion on github.com"&gt;Github&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/st-2025-riviere.jpg" alt="Alex Riviere with his session on Hot New HTML Features" title="Alex Riviere with his session on Hot New HTML Features" class="img-fluid no-float" width="640" height="385" /&gt;&lt;/p&gt;
&lt;p&gt;HTML has been forging ahead with a number of features and I'm guessing there are a lot of web developers who haven't seen (or used) all 103 features.&lt;/p&gt;
&lt;p&gt;In Alex's session, he covers seven of the most important enhancements to the HTML language over the past 10 years. The list includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;detail&amp;gt;&lt;/code&gt;/&lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; Elements&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;&amp;nbsp;Element&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;inert&lt;/code&gt; attribute (which I'm still wondering what the point is of this) :-)&lt;/li&gt;
&lt;li&gt;Popover API&lt;/li&gt;
&lt;li&gt;Attributes and &lt;code&gt;attr()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Declarative Shadowdom&lt;/li&gt;
&lt;li&gt;Updates to &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; elements&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While he could've talk about all &lt;a href="https://codepen.io/fimion/pen/qEBNzEo" title="Go to 103 HTML Features over 10 years on codepen.io"&gt;103 HTML features&lt;/a&gt;, this "magnificent seven" was probably the most important features to showcase.&lt;/p&gt;
&lt;p&gt;Of the seven mentioned, I didn't know about the &lt;code&gt;inert&lt;/code&gt; attribute or the updates to the &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; tag (which I'm happy about).&lt;/p&gt;
&lt;p&gt;Alex's enthusiasm and entertaining personality made this talk worth attending.&lt;/p&gt;
&lt;h3&gt;4:00p - HTMX: What's the big deal with the little framework?&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Eric Potter / &lt;a href="https://x.com/pottereric" title="Go to Eric Potter's X account on x.com"&gt;@pottereric&lt;/a&gt; / &lt;a href="https://humbletoolsmith.com/" title="Go to humbletoolsmith.com"&gt;Website&lt;/a&gt; / &lt;a href="https://github.com/pottereric" title="Go to Eric Potter's Github on github.com"&gt;Github&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/st-2025-potter.jpg" alt="Eric Potter with his session on HTMX" title="Eric Potter with his session on HTMX" class="img-fluid no-float" width="640" height="480" /&gt;&lt;/p&gt;
&lt;p&gt;Ever since the first of the year, I've been hearing of a small JavaScript library called &lt;a href="https://htmx.org/" title="Go to HTMX.org"&gt;HTMX&lt;/a&gt; and wanted to understand a bit more of what it was.&lt;/p&gt;
&lt;p&gt;Since I've been building out my open-source project called &lt;a href="https://www.danylkoweb.com/tuxboard" title="Go to Tuxboard"&gt;Tuxboard&lt;/a&gt;, I've been making various calls to the server to retrieve "Islands of HTML" using an &lt;a href="https://www.patterns.dev/vanilla/islands-architecture/" title="Go to Islands Architecture on patterns.dev"&gt;Islands Architecture&lt;/a&gt; for the widgets.&lt;/p&gt;
&lt;p&gt;After seeing what Eric presented during his session, HTMX seems like a likely candidate to encapsulate these types of calls and removing unnecessary JavaScript code. The declarative and unobtrusive approach to HTMX is very enticing and aligns with my "declarative-first" approach with Tuxboard as well.&lt;/p&gt;
&lt;p&gt;The approach may be something to consider for a future Tuxboard post, but as an alternative, I would also like to try &lt;a href="https://github.com/DamianEdwards/RazorSlices" title="Go to Razor Slices on github.com"&gt;Damian Edwards' Razor Slices&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Eric's session gave a great introduction into what HTMX was and how to use it with plenty of code samples.&lt;/p&gt;
&lt;p&gt;Great session!&lt;/p&gt;
&lt;h3&gt;5:00p - Movie Trailers / Feature Movie (THUNDERBOLTS!)&lt;/h3&gt;
&lt;p&gt;After all of the sessions, AMC had tables of popcorn all set for everyone to watch the Thunderbolts!&lt;/p&gt;
&lt;p&gt;LOVED the movie and stayed until the ending credits which set up another Summer blockbuster.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I feel Stir Trek was another big success this year! I saw a lot of old and new friends and co-workers (Kyle, &lt;a href="https://sadukie.com/2025/05/04/stir-trek-2025-recap.html" title="Go to Sarah's Stir Trek Recap on sadukie.com"&gt;Sadukie&lt;/a&gt;, Mark, Greg, Matt, Hugo, David). It was a blast.&lt;/p&gt;
&lt;p&gt;The one drawback to Stir Trek this year was the audio problems. During the first session, there was a reverb of some kind where it sounded like 3 people were talking at once and was hard to focus on the session's content. In the main room, the reverb was horrible, but in the alternative theaters, there was no reverb so I stuck to the secondary theaters.&lt;/p&gt;
&lt;p&gt;Eventually, the issue was resolved thanks to the AMC staff. I understand it was a hiccup and these things happen. :-)&lt;/p&gt;
&lt;p&gt;Every year, Stir Trek feels like going back to school. Each session lets out and everyone is scurrying to their next "class" while saying 'Hi' to everyone as they pass "in the hallways." hehehe&lt;/p&gt;
&lt;p&gt;With that said, a huge thank you to the organizers of Stir Trek! You guys rock putting all of this together every year and making it a success!&lt;/p&gt;
&lt;p&gt;Also, a big thank you to AMC Easton theaters and staff for accommodating everyone making this a successful conference this year (again).&lt;/p&gt;
&lt;p&gt;Can't wait until next year when we get Avengers: Doomsday! It'll be big!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;What was your favorite session? Did you stay for the movie? And do you know why there was an asterisk in the title? Post your comments below and let's discuss.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;ul class="list-inline link-list"&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://www.linkedin.com/in/jonathandanylko" title="LinkedIn Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/linkedin_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://twitter.com/jdanylko" title="Twitter Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/twitter_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://instagram.com/jdanylko" title="Instagram Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/instagram-16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jonathan "JD" Danylko is an author, web architect, and entrepreneur who's been programming for over 30 years. He's developed websites for small, medium, and Fortune 500 companies since 1996.&lt;/p&gt;
&lt;p&gt;He currently works at &lt;a href="https://www.danylkoweb.com/Blog/growing-up-with-insight-O4" title="Go to Growing up with Insight"&gt;Insight Enterprises&lt;/a&gt; as an Architect.&lt;/p&gt;
&lt;p&gt;When asked what he likes to do in his spare time, he replies, "I like to write and I like to code. I also like to write about code."&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Fri, 09 May 2025 00:00:00 -0700</pubDate></item><item><guid isPermaLink="false">41e89d40-e130-4c4d-8aba-b228d257bf75</guid><link>https://www.danylkoweb.com/Blog/how-to-restrict-pages-using-middleware-and-pagefilters-UG</link><title>How to Restrict Pages using Middleware and PageFilters</title><description>&lt;p&gt;By Jonathan "JD" Danylko&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Today's quick tip demonstrates how to limit users to a small number of pages&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/door-lock-with-keys.jpg" title="You are not allowed in...unless you access only these pages!" alt="Door with keys in the lock" class="img-fluid no-float" width="640" height="397" /&gt;&lt;/p&gt;
&lt;p&gt;Restricting pages to a user on a website can be tricky. There are times when users are only allowed to view a select number of pages.&lt;/p&gt;
&lt;p&gt;While this is easily implemented through MS Identity using the &lt;code&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authorization.authorizeattribute?view=aspnetcore-9.0" title="Go to AuthorizeAttribute on learn.microsoft.com"&gt;[Authorize]&lt;/a&gt;&lt;/code&gt; attribute on most pages, how could this concept apply to anonymous users?&lt;/p&gt;
&lt;p&gt;The most relevant question is why would someone need this?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Website launches&lt;/strong&gt; - Creating a landing page as a way to gather emails to notify users when the new site launches; Restrict access to only the landing page and a thank you page after submitting an email.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt; - During maintenance periods, users aren't able to access other pages. They only see the maintenance page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Luckily, there's a couple of ways to accomplish this and it's been available since ASP.NET Core 2.0.&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Restrict Users With IAsyncPageFilter&lt;/h2&gt;
&lt;p&gt;One way to accomplish this is with the &lt;code&gt;IAsyncPageFilter&lt;/code&gt; class.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/aspnet/core/razor-pages/filter" title="Go to Page Filters on learn.microsoft.com"&gt;Razor Page Filters&lt;/a&gt; are implemented with the &lt;code&gt;IPageFilter&lt;/code&gt; and &lt;code&gt;IAsyncPageFilter&lt;/code&gt; interfaces and they run before and after the &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-9.0" title="Go to Filters in ASP.NET Core on learn.microsoft.com"&gt;Razor Page Handler&lt;/a&gt;. They work similar to &lt;a href="https://www.danylkoweb.com/Blog/aspnet-mvc-core-migrating-actionfilters-into-middleware-components-IE" title="Go to ASP.NET MVC Core: Migrating Actions Filters into Middleware components"&gt;ActionFilters&lt;/a&gt;, but in addition to working on a single page, it can also apply to a larger scale of pages.&lt;/p&gt;
&lt;p&gt;In the example below, a list of pages are contained in an array at the top of the class allowing only the &lt;code&gt;Index&lt;/code&gt; and &lt;code&gt;About&lt;/code&gt; page available to anyone accessing the site. If a user tries to access any other page (or even a page that doesn't exist), they're returned to the &lt;code&gt;Index&lt;/code&gt; page.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;\Filters\PageAccessFilter.cs&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;PageAccessFilter&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="interface name"&gt;IAsyncPageFilter&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;[&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_allowedPages&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;[&lt;/span&gt;&lt;span class="string"&gt;"/Index"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"/About"&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;Task&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;OnPageHandlerExecutionAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name"&gt;PageHandlerExecutingContext&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="delegate name"&gt;             PageHandlerExecutionDelegate&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;next&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="field name"&gt;_allowedPages&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;Any&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="UnnecessaryCodeDiagnostic - parameter name;Semantic - (TRANSIENT)"&gt;p&lt;/span&gt;&lt;span class="UnnecessaryCodeDiagnostic"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="UnnecessaryCodeDiagnostic - operator;Semantic - (TRANSIENT)"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="UnnecessaryCodeDiagnostic"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;ActionDescriptor&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;RelativePath&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Contains&lt;/span&gt;&lt;span class="UnnecessaryCodeDiagnostic - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="UnnecessaryCodeDiagnostic - parameter name;Semantic - (TRANSIENT)"&gt;p&lt;/span&gt;&lt;span class="UnnecessaryCodeDiagnostic - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;HttpContext&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Response&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Redirect&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"/Index"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;next&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;Task&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;OnPageHandlerSelectionAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name"&gt;PageHandlerSelectedContext&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;Task&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;CompletedTask&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;In the &lt;code&gt;Program.cs&lt;/code&gt; file, add the &lt;code&gt;PageAccessFilter&lt;/code&gt; filter through the &lt;code&gt;AddRazorPages()&lt;/code&gt; method.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="local name"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Services&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;AddRazorPages&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;options&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;options&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Conventions&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;ConfigureFilter&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;PageAccessFilter&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;While this can be used for either a page or an entire website, another alternative is to implement a Middleware component.&lt;/p&gt;
&lt;h2&gt;Restrict Users with Middleware&lt;/h2&gt;
&lt;p&gt;The Middleware version is similar and can be used in a more global manner as opposed to the &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/razor-pages/filter" title="Go to Filter methods for Razor Pages on learn.microsoft.com"&gt;PageFilter&lt;/a&gt; approach. The Middleware approach is a bit more enticing since it's encountered earlier in the pipeline process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep in mind, a &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/" title="Go to Middleware's order of operation on learn.microsoft.com"&gt;Middleware's order of operation&lt;/a&gt; is extremely important&lt;i&gt; &lt;/i&gt;when adding Middleware components.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here is the &lt;code&gt;PageAccessMiddleware&lt;/code&gt; component&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;\Middleware\PageAccessMiddleware.cs&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;PageAccessMiddleware&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="interface name"&gt;ILogger&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name"&gt;PageAccessMiddleware&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - parameter name;Semantic - (TRANSIENT)"&gt;logger&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="delegate name"&gt;RequestDelegate&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;next&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;[&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_allowedPages&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;[&lt;/span&gt;&lt;span class="string"&gt;"/Index"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"/About"&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;Task&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - method name;Semantic - (TRANSIENT)"&gt;InvokeAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name"&gt;HttpContext&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="field name"&gt;_allowedPages&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;Any&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;p&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Request&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Path&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;HasValue&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Request&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Path&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Value&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Contains&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;p&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Response&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Redirect&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"/Index"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;next&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;In the &lt;code&gt;Program.cs&lt;/code&gt;, use the &lt;code&gt;UseMiddleware&amp;lt;PageAccessMiddleware&amp;gt;()&lt;/code&gt; method at the top of the method.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="local name"&gt;app&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;UseMiddleware&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name"&gt;PageAccessMiddleware&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Let's clean it up a bit by creating a Middleware extension method.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - class name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;PageAccessMiddlewareExtensions&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span class="interface name"&gt;IApplicationBuilder&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - extension method name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;UsePageAccessMiddleware&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&amp;nbsp;&lt;span class="interface name"&gt;IApplicationBuilder&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;builder&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;UseMiddleware&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name"&gt;PageAccessMiddleware&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Finally, replace the &lt;code&gt;UseMiddleware()&lt;/code&gt; method with the new extension method.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="local name"&gt;app&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;UsePageAccessMiddleware&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Once updated, running the example displays the main page and allow access to the About page. If trying to access the Privacy page, it redirects the user to the Index page.&lt;/p&gt;
&lt;p&gt;For additional points, instead of hard-coding an array of pages, they could easily be passed into the Middleware component.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this short post, we covered a way to restrict users to a collection of pages.&lt;/p&gt;
&lt;p&gt;Since &lt;code&gt;HttpContext.Request&lt;/code&gt; is available in both versions, other possibilities to implement could include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Limiting pages based on a directory&lt;/li&gt;
&lt;li&gt;Storing a list of allowable pages in a database&lt;/li&gt;
&lt;li&gt;Using a configuration file to enable/disable a website (i.e. maintenance purposes)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a website has to "go down" temporarily or force users to one or more pages, PageFilters or Middleware is a simple, quick, and efficient solution.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;How do you restrict users from other pages? What could be added to make the component better? Post your comments below and let's discuss.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;ul class="list-inline link-list"&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://www.linkedin.com/in/jonathandanylko" title="LinkedIn Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/linkedin_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://twitter.com/jdanylko" title="Twitter Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/twitter_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://instagram.com/jdanylko" title="Instagram Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/instagram-16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jonathan "JD" Danylko is an author, web architect, and entrepreneur who's been programming for over 30 years. He's developed websites for small, medium, and Fortune 500 companies since 1996.&lt;/p&gt;
&lt;p&gt;He currently works at &lt;a href="https://www.danylkoweb.com/Blog/growing-up-with-insight-O4" title="Go to Growing up with Insight"&gt;Insight Enterprises&lt;/a&gt; as an Architect.&lt;/p&gt;
&lt;p&gt;When asked what he likes to do in his spare time, he replies, "I like to write and I like to code. I also like to write about code."&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Wed, 30 Apr 2025 00:00:00 -0700</pubDate></item><item><guid isPermaLink="false">12bed73d-fb7a-4cb3-a84e-71710978f09f</guid><link>https://www.danylkoweb.com/Blog/tuxboard-192-released-UF</link><title>Tuxboard 1.9.2 Released</title><description>&lt;p&gt;By Jonathan "JD" Danylko&lt;/p&gt;&lt;p&gt;&lt;strong&gt;With the latest release, Tuxboard is now updated to use "generic" dashboards with custom user identifiers&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-same-data-type.jpg" title="Tuxboard 1.9.2 Released" alt="Two images of the same object" class="img-fluid no-float" width="640" height="427" /&gt;&lt;/p&gt;
&lt;p&gt;With the continued success of Tuxboard, I am happy to announce version 1.9.2 is now available. While the version is a minor update, it provides customized user data types for dashboards.&lt;/p&gt;
&lt;p&gt;One problem while using Tuxboard on various projects is the inflexible schema of the Dashboard table. The goal of the Dashboard table is to provide a mapping of a dashboard to a user. The Dashboard table contains the following fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DashboardID&lt;/strong&gt; - Unique Identifier (GUID)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SelectedTab&lt;/strong&gt; - integer (future use; TBD)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UserID&lt;/strong&gt; - &amp;lt;custom identifier of your user&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When Tuxboard was initially developed, the UserID was defaulted to a GUID type modeled after MS Identity. Microsoft Identity's flexible security framework even received it's own Azure security area called &lt;a href="https://entra.microsoft.com/" title="Go to Microsoft Entra"&gt;Entra&lt;/a&gt;. By default, Microsoft Identity uses a GUID for the User's ID.&lt;/p&gt;
&lt;p&gt;After integrating Tuxboard into a select number of legacy projects (and receiving feedback), there were times when the UserID had to be either a GUID or an integer and, with Tuxboard, there was only one option.&lt;/p&gt;
&lt;p&gt;So how do you allow a library to use a custom data type throughout the entire library and still have the library function as expected?&lt;/p&gt;
&lt;h2&gt;The Approach&lt;/h2&gt;
&lt;p&gt;As mentioned previously, the Dashboard table is the only table using a custom data type (&lt;code&gt;UserID&lt;/code&gt;). Everything else in Tuxboard is strictly library-specific. Once we have a &lt;code&gt;DashboardID&lt;/code&gt;, we can get everything else required for a dashboard to work as expected.&lt;/p&gt;
&lt;p&gt;How can you customize a field to be multiple types?&lt;/p&gt;
&lt;p&gt;After dissecting the problem, the answer was to use the Microsoft Identity approach since it handles the problem quite efficiently.&lt;/p&gt;
&lt;h3&gt;Using Generics&lt;/h3&gt;
&lt;p&gt;Microsoft Identity uses generics throughout their framework and the library can adapt to any data type whether it's a GUID, string, or integer. Why not incorporate the same pattern into Tuxboard?&lt;/p&gt;
&lt;p&gt;Again, the only affected table is the Dashboard table and requires a couple changes to the following classes in the code.&lt;/p&gt;
&lt;h2&gt;Updating a Project&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;These types of changes were intended to be minimal as Tuxboard continues to move forward&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;With this release, &lt;a href="https://github.com/jdanylko/Tuxboard.Examples/discussions" title="Go to Tuxboard.Example Discussions on github.com"&gt;a discussion on Github is available&lt;/a&gt; to review these decisions even further.&lt;/p&gt;
&lt;p&gt;To update a project, update the version of Tuxboard to 1.9.2 through NuGet. As an example of updating a project, we'll use one of the Tuxboard.Examples (&lt;a href="https://github.com/jdanylko/Tuxboard.Examples/tree/master/12-Creating-Widgets" title="Go to Creating Widgets on github.com"&gt;12-Creating-Widgets&lt;/a&gt;). If interested in seeing all of the changes made to the example, check the &lt;a href="https://github.com/jdanylko/Tuxboard.Examples/commit/b0a9d18b5c957d6c531057ce3613817d6099b096#diff-0d821c9f41e7dec7c3416caa93ddf4616b6d67067f73a34e94eb4277373ced56" title="Go to 12-Creating-Widgets on github.com/jdanylko/tuxboard.examples"&gt;branch merge&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;Program.cs&lt;/code&gt; file, change the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change &lt;code&gt;TuxDbContext&lt;/code&gt; concrete classes and &lt;code&gt;ITuxDbContext&lt;/code&gt; interfaces to include the generic type of your choice (i.e. either &lt;code&gt;TuxDbContext&amp;lt;int&amp;gt;&lt;/code&gt; / &lt;code&gt;ITuxDbContext&amp;lt;int&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Change &lt;code&gt;DashboardService&lt;/code&gt; and &lt;code&gt;IDashboardService&lt;/code&gt; to a generic type (i.e. &lt;code&gt;DashboardService&amp;lt;Guid&amp;gt;&lt;/code&gt; / &lt;code&gt;IDashboardService&amp;lt;Guid&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the &lt;code&gt;Index.cshtml.cs&lt;/code&gt; page,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the &lt;code&gt;IDashboardService&lt;/code&gt; to &lt;code&gt;IDashboardService&amp;lt;int&amp;gt;&lt;/code&gt; (or &lt;code&gt;IDashboardService&amp;lt;Guid&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Change &lt;code&gt;Dashboard&lt;/code&gt; to &lt;code&gt;Dashboard&amp;lt;int&amp;gt;&lt;/code&gt; (or Guid)&lt;/li&gt;
&lt;li&gt;In the &lt;code&gt;GetIdentity()&lt;/code&gt; method, it returns a Guid. If using an integer, change the method as necessary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Update the following ViewComponents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;code&gt;TuxbarViewComponent&lt;/code&gt; (&lt;code&gt;\Pages\Shared\Components\Tuxbar&lt;/code&gt;),
&lt;ul&gt;
&lt;li&gt;Change the &lt;code&gt;Dashboard&lt;/code&gt; parameter to a generic (&lt;code&gt;Dashboard&amp;lt;Guid&amp;gt;&lt;/code&gt;/&lt;code&gt;&amp;lt;int&amp;gt;&lt;/code&gt;) in the &lt;code&gt;.cs&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Change the model in the View from &lt;code&gt;Dashboard&lt;/code&gt; to &lt;code&gt;Dashboard&amp;lt;Guid&amp;gt;&lt;/code&gt;/&lt;code&gt;&amp;lt;int&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Perform the same update for the &lt;code&gt;TuxboardTemplateViewComponent&lt;/code&gt; (&lt;code&gt;\Pages\Shared\Components\TuxboardTemplate&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If everything was updated correctly, perform a migration to see the changes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the Package Manager Console (&lt;em&gt;View &amp;gt; Other Windows... &amp;gt; Package Manager Console&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Confirm you have the &lt;strong&gt;12-Creating-Widgets&lt;/strong&gt;&amp;nbsp;project selected in the Default Project Dropdown in the Package Manager Console.&lt;/li&gt;
&lt;li&gt;If a migration doesn't exist, create one by typing&lt;br /&gt;&lt;code&gt;&lt;span class="formal language"&gt;add-migration&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;Initial&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;-Context&lt;/span&gt; TuxboardRoleDb&lt;span class="formal language"&gt;Context&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;-OutputDir&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;Data\Migrations\TuxboardContext&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Update the database by applying the migration by typing &lt;br /&gt;&lt;code&gt;update-database -Context TuxboardRoleDbContext&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Open the Dashboard table to confirm the UserID is the same data type as the C# type.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This should complete the process of upgrading to a generic dashboard.&lt;/p&gt;
&lt;p&gt;Once the database is updated, the UserID data type should match in both the Identity's User table and Dashboard table.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-data-type.jpg" title="Screenshot of Tuxboard table changes" alt="Screenshot of Tuxboard table changes" class="img-fluid no-float" width="684" height="315" /&gt;&lt;/p&gt;
&lt;p&gt;As a general rule of thumb, whatever the UserID's data type is in Identity, the UserID in the Dashboard table should be defined as the same data type.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;With the update of 1.9.2, I'll continue to add new features to Tuxboard and respond to feedback to make it a better dashboard toolkit for ASP.NET Core users.&lt;/p&gt;
&lt;div class="alert alert-info" role="alert"&gt;
&lt;h4 class="alert-heading"&gt;Tuxboard Resources&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Go to Creating Custom Tuxboard Widgets" href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;strong&gt;&lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Were there issues with the update? How are you using Tuxboard? Post your comments below and let's discuss.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;ul class="list-inline link-list"&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://www.linkedin.com/in/jonathandanylko" title="LinkedIn Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/linkedin_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://twitter.com/jdanylko" title="Twitter Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/twitter_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://instagram.com/jdanylko" title="Instagram Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/instagram-16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jonathan "JD" Danylko is an author, web architect, and entrepreneur who's been programming for over 30 years. He's developed websites for small, medium, and Fortune 500 companies since 1996.&lt;/p&gt;
&lt;p&gt;He currently works at &lt;a href="https://www.danylkoweb.com/Blog/growing-up-with-insight-O4" title="Go to Growing up with Insight"&gt;Insight Enterprises&lt;/a&gt; as an Architect.&lt;/p&gt;
&lt;p&gt;When asked what he likes to do in his spare time, he replies, "I like to write and I like to code. I also like to write about code."&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Wed, 16 Apr 2025 00:00:00 -0700</pubDate></item><item><guid isPermaLink="false">d5528d57-9e51-4956-8b59-42b8b1712093</guid><link>https://www.danylkoweb.com/Blog/harnessing-net-and-c-for-better-seo-how-it-can-boost-your-website-rankings-RX</link><title>Harnessing .NET and C# for Better SEO: How It Can Boost Your Website Rankings</title><description>&lt;p&gt;By Jonathan "JD" Danylko&lt;/p&gt;&lt;p&gt;&lt;strong&gt;With the latest .NET and C#, it's now easier to apply technical SEO to a website, provide quality content, and analyze search traffic&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/dec-12-main-image.jpg" title="C# Advent" alt="Chalkboard with the text C# Advent surrounded by Christmas gifts" class="img-fluid no-float" width="640" height="427" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Notice:&lt;/strong&gt; This post is part of the&lt;span&gt; &lt;/span&gt;&lt;strong&gt;Eighth Annual C# Advent Calendar&lt;/strong&gt; for 2024. Check the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;a href="https://www.csadvent.christmas/"&gt;C# Advent&lt;/a&gt;&lt;/strong&gt; for more than 50 other great articles about C# created by the community. Thanks a lot to Matt Groves (&lt;a href="https://twitter.com/mgroves" title="Go to @mgroves on Twitter.com"&gt;@mgroves&lt;/a&gt;) for putting this together again! Great job, Matt!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Recently, I was asked to present on the topic of &lt;abbr title="Search Engine Optimization"&gt;SEO&lt;/abbr&gt; to a C# user's group (and thank you Sam Nasir for the opportunity). While ASP.NET has been (and always will be) my bread and butter, I feel using SEO on websites should be a secondary skill if developers are always building websites.&lt;/p&gt;
&lt;p&gt;So, in preparing for the presentation, I wanted to integrate as much ASP.NET, C#, and SEO as possible. During the presentation, I mentioned several SEO and .NET techniques used in helping a public website gain more visibility through search engine/website best practices.&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/-6KiimlzdDI?si=-hFQgwNwr_ESekif" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;&lt;em&gt;Source: &lt;a href="https://www.youtube.com/watch?v=-6KiimlzdDI" title="Go to Improving Website SEO by Jonathan Danylko on YouTube.com "&gt;YouTube&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;In this post, we'll focus specifically on technical SEO which optimizes a website through server-side techniques to optimize its ranking and positioning in search engines and briefly touch on the 'M' word (marketing). In this case, by using C# and .NET.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I briefly touched on certain topics in the presentation, but feel like they fell short because, of course, developers like to see code. This post is meant to go a bit deeper by providing a couple coding examples (mainly C# tips). The topics focus on the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keyword Density&lt;/li&gt;
&lt;li&gt;Minifying HTML&lt;/li&gt;
&lt;li&gt;Keyword Research&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, let's see how C# can boost your website's SEO.&lt;/p&gt;
&lt;h2&gt;Keyword Density&lt;/h2&gt;
&lt;p&gt;With the latest release of &lt;a href="https://dotnet.microsoft.com/en-us/download/dotnet/9.0" title="Go to Download .NET 9.0 on dotnet.microsoft.com"&gt;.NET 9.0&lt;/a&gt;, I was excited to see the CountBy/AggregateBy methods included.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;p&gt;Search engines analyze content and provide the best choice based on the topic's relevancy. One way search engines identify relevancy is to examine the number of keywords in a web page and how they relate to a topic.&lt;/p&gt;
&lt;p&gt;The new &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.countby?view=net-9.0" title="Go to IEnumerable.CountBy on learn.microsoft.com"&gt;CountBy&lt;/a&gt;&amp;nbsp;and &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.aggregateby?view=net-9.0" title="Go to IEnumerable.AggregateBy on learn.microsoft.com"&gt;AggregateBy&lt;/a&gt; methods return the count of elements in a list grouped by a key. In SEO terms, it allows us to identify the most prevalent keywords in a particular string or array.&lt;/p&gt;
&lt;p&gt;If given some text, we can identify the most frequent words used in the post. Let's look at a simple example.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="property name"&gt;KeywordResults&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;TextToAnalyze&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Split&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;[&lt;/span&gt;&lt;span class="string"&gt;'&amp;nbsp;'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;'.'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;','&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;]&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="enum name"&gt;StringSplitOptions&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="enum member name"&gt;RemoveEmptyEntries&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;Select&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;ToLowerInvariant&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;()&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;Where&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="field name"&gt;_stopWords&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;Contains&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;CountBy&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;e&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;OrderByDescending&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Value&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;Where&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Value&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;&amp;gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;ToList&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;()&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Before counting the words, the text is split delimited by spaces, periods, and commas. Once the list is split, each word is converted to lowercase.&lt;/p&gt;
&lt;p&gt;Next, all filler words are removed so the CountBy method focuses on only topical words meaning something. The &lt;code&gt;_stopWords&lt;/code&gt; list contains words to be ignored and meant to be removed.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;[]&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_stopWords&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;[&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="string"&gt;"a"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"an"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"on"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"of"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"or"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"as"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"i"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"in"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"is"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"to"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="string"&gt;"the"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"and"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"for"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"with"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"not"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"by"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"was"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"it"&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;]&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The CountBy method is called to count all words and their frequency. The result produces a &lt;code&gt;Dictionary&amp;lt;string,int&amp;gt;&lt;/code&gt; where the Key is the word and the Value is the number of times it's used in the text.&lt;/p&gt;
&lt;p&gt;Once the words are counted, the list is sorted by the Value in descending order and only where there are two or more occurrences.&lt;/p&gt;
&lt;p&gt;Of course, additional punctuation and stop words can be added for more accurate results.&lt;/p&gt;
&lt;p&gt;For the best results, use one or two keywords for every 200 words or 2-4% of the text should contain targeted keywords.&lt;/p&gt;
&lt;p&gt;Based on the &lt;a href="https://patents.google.com/patent/US8577893B1/en" title="Go to Google Patent on patents.google.com"&gt;Google Patent regarding links&lt;/a&gt;, this fundamental concept can be expanded further to achieve better search results with context chunking. In the patent, Google looks at the link, and then examines the words to the left AND right of the link to determine the context and value of the link.&lt;/p&gt;
&lt;p&gt;As mentioned in the video above, search engines look at a number of factors when it comes to links. It's best to provide as much information as possible so search engines can serve relevant pages to drive traffic to a site...specifically to YOUR website.&lt;/p&gt;
&lt;h2&gt;Minifying HTML&lt;/h2&gt;
&lt;p&gt;The performance of a website is extremely important and is &lt;a href="https://searchengineland.com/google-now-counts-site-speed-as-ranking-factor-39708" title="Go to Google now counts site speed as a ranking factor on searchengineland.com"&gt;one of the factors in determining a website's ranking&lt;/a&gt; in search engines.&lt;/p&gt;
&lt;p&gt;As mentioned in "&lt;strong&gt;&lt;a href="https://packt.link/4uFao" title="Go to ASP.NET 8 Best Practices on Amazon.com"&gt;ASP.NET 8 Best Practices&lt;/a&gt;&lt;/strong&gt;," next to security, performance is one of the most important parts of a successful website.&lt;/p&gt;
&lt;p&gt;While GZip compression is another technology to implement, the ability to minify your HTML shrinks the payload even further. In earlier versions of .NET, this concept was achieved through &lt;a href="https://www.danylkoweb.com/Blog/my-top-5-aspnet-mvc-actionfilters-AD" title="Go to My Top 5 ASP.NET MVC ActionFilters"&gt;ActionFilters for MVC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With the Middleware pipeline, we can take advantage of updating a webpage by minifying it on the return trip to the client/browser.&lt;/p&gt;
&lt;p&gt;If we look at the &lt;code&gt;Index.cshtml&lt;/code&gt; page without minifying the HTML, we can see it's at 3.6K.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/dec-12-before-middleware.png" title="Size of the document before minifying the HTML document" alt="Screenshot of developer tools displaying the size of the HTML document" class="img-fluid no-float" width="597" height="69" /&gt;&lt;/p&gt;
&lt;p&gt;With a Middleware approach, we can use Regular Expressions (aka black voodoo magic) to remove the spaces, carriage returns, and linefeeds from the HTML.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Middleware\MinifyHtmlMiddleware.cs&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name;Semantic - namespace name;Semantic - (TRANSIENT)"&gt;System&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name;Semantic - namespace name;Semantic - (TRANSIENT)"&gt;Text&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name;Semantic - namespace name;Semantic - (TRANSIENT)"&gt;RegularExpressions&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;br /&gt;namespace&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name;Semantic - namespace name;Semantic - (TRANSIENT)"&gt;SEOWithCSharp&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name;Semantic - namespace name;Semantic - (TRANSIENT)"&gt;Middleware&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;MinifyHtmlMiddleware&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="delegate name;Semantic - delegate name;Semantic - (TRANSIENT)"&gt;RequestDelegate&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;next&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ILoggerFactory&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - parameter name;Semantic - (TRANSIENT)"&gt;loggerFactory&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - method name;Semantic - (TRANSIENT)"&gt;InvokeAsync&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - (TRANSIENT)"&gt;HttpContext&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;stream&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name;Semantic - property name;Semantic - (TRANSIENT)"&gt;Response&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name;Semantic - property name;Semantic - (TRANSIENT)"&gt;Body&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;buffer&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - (TRANSIENT)"&gt;MemoryStream&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name;Semantic - property name;Semantic - (TRANSIENT)"&gt;Response&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name;Semantic - property name;Semantic - (TRANSIENT)"&gt;Body&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="local name;Semantic - local name;Semantic - (TRANSIENT)"&gt;buffer&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;next&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;isHtml&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Response&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;ContentType&lt;/span&gt;&lt;span class="operator"&gt;?&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;ToLower&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Contains&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"text/html"&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="local name"&gt;isHtml&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;GetValueOrDefault&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Response&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Body&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;stream&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="local name"&gt;buffer&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Seek&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="enum name"&gt;SeekOrigin&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="enum member name"&gt;Begin&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;content&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;StreamReader&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;buffer&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;ReadToEndAsync&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Response&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;StatusCode&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="number"&gt;200&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;isHtml&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;GetValueOrDefault&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="local name"&gt;content&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;Regex&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Replace&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="local name"&gt;content&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="string - verbatim"&gt;@"&lt;/span&gt;&lt;span class="ReSharper Regex Group - regex - grouping;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="ReSharper Regex Group - regex - grouping;Semantic - (TRANSIENT)"&gt;?&lt;/span&gt;&lt;span class="ReSharper Regex Group - regex - grouping;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ReSharper Regex Group - regex - grouping;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="ReSharper Regex Identifier - regex - character class;Semantic - (TRANSIENT)"&gt;\&lt;/span&gt;&lt;span class="ReSharper Regex Identifier - regex - character class;Semantic - (TRANSIENT)"&gt;s&lt;/span&gt;&lt;span class="ReSharper Regex Group - regex - grouping;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="ReSharper Regex Identifier - regex - character class;Semantic - (TRANSIENT)"&gt;\&lt;/span&gt;&lt;span class="ReSharper Regex Identifier - regex - character class;Semantic - (TRANSIENT)"&gt;s&lt;/span&gt;&lt;span class="ReSharper Regex Identifier - ReSharper Regex Quantifier - regex - quantifier;Semantic - (TRANSIENT)"&gt;+&lt;/span&gt;&lt;span class="ReSharper Regex Group - regex - grouping;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="ReSharper Regex Group - regex - grouping;Semantic - (TRANSIENT)"&gt;?&lt;/span&gt;&lt;span class="ReSharper Regex Group - regex - grouping;Semantic - (TRANSIENT)"&gt;!&lt;/span&gt;&lt;span class="ReSharper Regex Set - regex - character class;Semantic - (TRANSIENT)"&gt;[&lt;/span&gt;&lt;span class="ReSharper Regex Set - regex - character class;Semantic - (TRANSIENT)"&gt;^&lt;/span&gt;&lt;span class="regex - text"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="ReSharper Regex Set - regex - character class;Semantic - (TRANSIENT)"&gt;]&lt;/span&gt;&lt;span class="ReSharper Regex Identifier - ReSharper Regex Quantifier - regex - quantifier;Semantic - (TRANSIENT)"&gt;*&lt;/span&gt;&lt;span class="regex - text"&gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class="ReSharper Regex Group - regex - grouping;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="string - verbatim"&gt;"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="enum name"&gt;RegexOptions&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="enum member name"&gt;Compiled&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Replace&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="ReSharper C# Escape Character 1 - string - escape character;Semantic - (TRANSIENT)"&gt;\r&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Replace&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="ReSharper C# Escape Character 1 - string - escape character;Semantic - (TRANSIENT)"&gt;\n&lt;/span&gt;&lt;span class="string"&gt;"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Response&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;WriteAsync&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;content&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;finally&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Response&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Body&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;stream&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Middleware\MinifyHtmlExtensions.cs&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;namespace&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name"&gt;SEOWithCSharp&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Middleware&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;MinifyHtmlExtensions&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span class="interface name"&gt;IApplicationBuilder&lt;/span&gt;&amp;nbsp;&lt;span class="extension method name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;UseMinifyHtml&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&amp;nbsp;&lt;span class="interface name"&gt;IApplicationBuilder&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;builder&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;UseMiddleware&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name"&gt;MinifyHtmlMiddleware&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;To use the Middleware, add this line to the &lt;code&gt;Program.cs&lt;/code&gt; file.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="local name"&gt;app&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;UseMinifyHtml&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;If we load the webpage now, we can see the results of our efforts.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/dec-12-after-middleware.png" title="Size of the document after minifying the HTML document" alt="Screenshot of developer tools displaying the size of the document after minifying the HTML" class="img-fluid no-float" width="624" height="66" /&gt;&lt;/p&gt;
&lt;p&gt;The webpage is minified to a low 3K, a difference of 16%.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Of course, everyone's mileage may vary. If returning a heavy HTML webpage, the benefits should be apparent.&lt;/p&gt;
&lt;p&gt;While most &lt;a href="https://www.madskristensen.net/blog/effects-of-gzipping-vs-minifying-html-files" title="Go to Effects of GZipping vs Minifying HTML files on madskristensen.net"&gt;webpages achieve a 6-16% decrease in file size&lt;/a&gt; by minifying HTML (which in turn, increases overall performance), most developers feel content with leaving GZip compression in place without minifying.&lt;/p&gt;
&lt;p&gt;Personally, I feel using both GZip compression AND minifying HTML would pack more of a punch for a website's performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sidenote&lt;/strong&gt;: With .NET 9.0, I ran into one issue with the new &lt;code&gt;app.MapStaticAssets()&lt;/code&gt; endpoint extension method. With the new approach of bundling/minifying assets on-the-fly, it caused issues which requires additional time for discovery to determine what's happening behind the scenes. I've tried to dynamically build/create/bundle images in the past by &lt;a href="https://www.danylkoweb.com/Blog/update-dynamically-resizing-your-asp-net-mvc-images-LT" title="Go to UPDATE: Dynamically Resizing Your ASP.NET MVC Images"&gt;dynamically resized images&lt;/a&gt;, but takes too long when requesting a page full of images. It's best to create a process for &lt;a href="https://www.danylkoweb.com/Blog/task-runner-gulp-update-in-visual-studio-SM" title="Go to Task Runner: Gulp Update in Visual Studio"&gt;optimizing client-side assets using a Task Runner&lt;/a&gt; at build time. With that said, I reverted back to the &lt;code&gt;app.UseStaticFiles()&lt;/code&gt; and the HTML minifies as expected.&lt;/p&gt;
&lt;h2&gt;Keyword Research&lt;/h2&gt;
&lt;p&gt;How do you know what to write about on a technical blog?&lt;/p&gt;
&lt;p&gt;As Wayne Gretzky said, "&lt;em&gt;Skate to where the puck is going to be, not where it has been.&lt;/em&gt;" For example, since .NET 9.0 was recently released, it makes sense to write about all of the latest features since developers want to know about how to use it.&lt;/p&gt;
&lt;p&gt;.NET has a large ecosystem and can seem overwhelming...so what's a popular topic to write about?&lt;/p&gt;
&lt;p&gt;There are four ways to identify what keywords are popular:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use a third-party dedicated to SEO (&lt;a href="https://ahrefs.com/" title="Go to Ahrefs.com"&gt;Ahrefs.com&lt;/a&gt;, &lt;a href="https://www.semrush.com/" title="Go to SEMRush.com"&gt;SEMRush&lt;/a&gt;,&amp;nbsp; &lt;a href="https://majestic.com/" title="Go to Majestic.com"&gt;MajesticSEO&lt;/a&gt;, etc.). For additional tools, search for "SEO tools."&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://ads.google.com/home/tools/keyword-planner/" title="Go to Google Keyword Planner at ads.google.com"&gt;Google Keyword Planner&lt;/a&gt; for volume, popularity, and average ad cost.&lt;/li&gt;
&lt;li&gt;Go old school with a search bar's Autosuggest/"People also search for" at the bottom of a search page. Usually, these are the most popular search terms people are typing into search engines.&lt;/li&gt;
&lt;li&gt;Use C# to analyze and data mine keywords.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;"How can we use C# to do keyword research?"&lt;/p&gt;
&lt;p&gt;There is a reasonably-priced service called &lt;strong&gt;&lt;a href="https://dataforseo.com/" title="Go to DataForSeo.com"&gt;DataForSEO.com&lt;/a&gt;&lt;/strong&gt; which provides a REST API for keyword data, search engine result pages, and content analysis just to name a few of the services.&lt;/p&gt;
&lt;p&gt;As a way to test drive the services, I was given $1 (yes, one dollar) for the playground and I've yet to use it all.&lt;/p&gt;
&lt;p&gt;Once you sign up and receive your API key, these services are a simple C# call to perform SEO-related services. If you need an example of what APIs are available, they have an &lt;strong&gt;&lt;a href="https://app.dataforseo.com/api-dashboard" title="Go to API dashboard on app.dataforseo.com"&gt;API Playground&lt;/a&gt;&lt;/strong&gt; as well. The playground also creates a JSON result so you can easily create a quick C# model hierarchy using the &lt;a href="https://learn.microsoft.com/en-us/visualstudio/ide/reference/paste-json-xml?view=vs-2022" title="Go to Paste JSON or XML as classes on learn.microsoft.com"&gt;Visual Studio 2022's "Paste JSON as classes"&lt;/a&gt; feature.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;These techniques are but a few of the ways to incorporate modern website techniques by utilizing their C# skills to boost website performance, gain more visibility to their site, and write more relevant content for readers.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Identify primary keywords to be used in a blog post (&lt;em&gt;using Keyword Research&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Write a post containing those keywords and sprinkle them throughout the article to provide relevancy and context to the search engines (&lt;em&gt;using Keyword Density&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Apply Technical SEO concepts to the site making it faster (&lt;em&gt;like MinifyHtmlMiddleware&lt;/em&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Web developers should have a general understanding of basic marketing (yes, I said the 'M' word) of a website by applying Technical SEO techniques at the very least.&lt;/p&gt;
&lt;p&gt;Check out the Github repository below.&lt;/p&gt;
&lt;div class="github-widget" data-repo="jdanylko/SEOWithCSharp"&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Did you find this post interesting? Want more Technical SEO content with C#? Post your comments below and let's discuss.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;ul class="list-inline link-list"&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://www.linkedin.com/in/jonathandanylko" title="LinkedIn Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/linkedin_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://twitter.com/jdanylko" title="Twitter Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/twitter_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://instagram.com/jdanylko" title="Instagram Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/instagram-16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jonathan "JD" Danylko is an author, web architect, and entrepreneur who's been programming for over 30 years. He's developed websites for small, medium, and Fortune 500 companies since 1996.&lt;/p&gt;
&lt;p&gt;He currently works at &lt;a href="https://www.danylkoweb.com/Blog/growing-up-with-insight-O4" title="Go to Growing up with Insight"&gt;Insight Enterprises&lt;/a&gt; as an Architect.&lt;/p&gt;
&lt;p&gt;When asked what he likes to do in his spare time, he replies, "I like to write and I like to code. I also like to write about code."&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Wed, 11 Dec 2024 00:00:00 -0700</pubDate></item><item><guid isPermaLink="false">05024387-8708-4b96-8962-9723d2fac08a</guid><link>https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB</link><title>Creating Custom Tuxboard Widgets</title><description>&lt;p&gt;By Jonathan "JD" Danylko&lt;/p&gt;&lt;p&gt;&lt;strong&gt;In today's post, we cover the process of building and adding new widgets to Tuxboard&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-custom-widget.jpg" alt="Collection of cans on an assembly line" title="Widgets on an assembly line" class="img-fluid no-float" width="640" height="427" /&gt;&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Go to Creating Default Widgets using Roles"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;strong&gt;&lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In the last &lt;strong&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;post&lt;/a&gt;&lt;/strong&gt;, we discussed how a user could view available widgets based on their roles in the application.&lt;/p&gt;
&lt;p&gt;While widgets are a fundamental part of Tuxboard, this series of posts never mentioned how to create a widget.&lt;/p&gt;
&lt;p&gt;Since widgets are a big thing with Tuxboard, there's a lot to cover. For this initial post, we'll break this into multiples posts to make it easier to digest.&lt;/p&gt;
&lt;p&gt;In this post, we'll go over the process of creating a new Tuxboard widget.&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;To review the &lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;goals&lt;/a&gt; of Tuxboard, &amp;nbsp;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Easy Integration&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- Simple enhancement to applications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Declarative first, Programmatic second&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- The concept of modifying Tuxboard using HTML, CSS, and JavaScript/TypeScript was more enticing than modifying code, then compiling. However, the option of writing code is available.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensibility&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- Providing simple hooks at the programmatic and database level to speed up custom development requirements.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These three goals are always at the top of the list for easy dashboard development, but today, we focus on the "Extensibility" and "Easy Integration" part of Tuxboard.&lt;/p&gt;
&lt;p&gt;Once a Tuxboard dashboard is running for users, the ability to create additional widgets was essential.&lt;/p&gt;
&lt;p&gt;Since developers need a way to keep up with the latest news, we'll add a Stack Overflow Blog RSS feed widget.&lt;/p&gt;
&lt;h2&gt;Type of Widgets&lt;/h2&gt;
&lt;p&gt;There are two types of widgets in Tuxboard: Standard and Static.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- Widgets with a heading allowing users to interact with the widget's information/settings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Static&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- Widget meant to display information with no interaction&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The posts in series focused primarily on standard widgets. &lt;strong&gt;Static widgets&lt;/strong&gt; are simply a box displaying information with no interaction or actions.&lt;/p&gt;
&lt;p&gt;We'll get into static widgets in a later post.&lt;/p&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;We're using the source code from the last project (&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;11-Creating-Default-Widgets&lt;/a&gt; / &lt;a href="https://github.com/jdanylko/Tuxboard.Examples/tree/master/11-Default-Widgets" title="Go to 11-Creating-Default-Widgets on github.com"&gt;repository&lt;/a&gt;). Follow the steps under the &lt;strong&gt;"Getting Started"&lt;/strong&gt; heading.&lt;/p&gt;
&lt;p&gt;Once finished, we'll continue with the next section.&lt;/p&gt;
&lt;h2&gt;Creating the RSS Widget&lt;/h2&gt;
&lt;p&gt;When building a new widget, only two places are required to update: The Components folder and the database.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ViewComponents folder &lt;/strong&gt;- The folder (&lt;em&gt;Pages\Shared\Components\&lt;/em&gt;) is the widget name containing the body of the widget.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Widget / WidgetDefault / WidgetDefaultOption&lt;/strong&gt; tables - These tables are what drives the adding of widgets to a dashboard&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's break down each one and examine what's required to add the Stack Overflow Blog RSS Widget (Man, that's a mouthful...I'll just call it RSS Widget from now on).&lt;/p&gt;
&lt;h3&gt;Step 1: Creating the RSS [View]Component Folder&lt;/h3&gt;
&lt;p&gt;In Tuxboard, the term widget and ViewComponent are interchangeable. If you understand ViewComponents, then you already understand a widget in Tuxboard.&lt;/p&gt;
&lt;p&gt;ViewComponents are absolutely essential in creating these "islands of HTML." As mentioned in the past, there are a &lt;a href="https://www.danylkoweb.com/Blog/6-reasons-to-use-viewcomponents-in-aspnet-5-S3" title="Go to 6 Reasons to Use ViewComponents in ASP.NET 5"&gt;lot of benefits to using ViewComponents&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;To add the RSS Widget, create a folder called "Rss" under the &lt;code&gt;Pages/Shared/Components&lt;/code&gt; folder and add the following files into the "Rss" folder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Pages/Shared/Components/Rss/RssViewComponent.cs&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name"&gt;Microsoft&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;AspNetCore&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Mvc&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name"&gt;Tuxboard&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Core&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Domain&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Entities&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;br /&gt;namespace&lt;/span&gt; &lt;span class="namespace name"&gt;CreatingWidgets&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Pages&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Shared&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Components&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Rss&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;&lt;br /&gt;[&lt;/span&gt;&lt;span class="class name"&gt;ViewComponent&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="property name"&gt;Name&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"rss"&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;RssViewComponent&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;ViewComponent&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="interface name"&gt;IViewComponentResult&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;Invoke&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="class name"&gt;WidgetPlacement&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;placement&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;rssFeed&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;Uri&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"https://stackoverflow.blog/feed"&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;feed&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;FeedReader&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;rssFeed&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Get&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;widgetModel&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;RssWidgetModel&lt;/span&gt;&amp;nbsp;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Placement&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;placement&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Feed&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;feed&lt;/span&gt;&amp;nbsp;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;View&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;widgetModel&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Pages/Shared/Components/Rss/Default.cshtml&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorDirective;Semantic - (TRANSIENT)"&gt;model&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;RssWidgetModel&lt;/span&gt;&lt;br /&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;h6&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Feed&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Title&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Text&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;h6&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;ul&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;list-unstyled&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="keyword - control;Semantic - keyword - control;Syntactic - (TRANSIENT)"&gt;foreach&lt;/span&gt;&amp;nbsp;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="keyword;Semantic - keyword;Syntactic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;feedItem&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control;Semantic - keyword - control;Syntactic - (TRANSIENT)"&gt;in&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Feed&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Items&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - method name;Syntactic - (TRANSIENT)"&gt;Take&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Limit&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;li&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;p&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;a&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;href&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;feedItem&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Links&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - method name;Syntactic - (TRANSIENT)"&gt;First&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Uri&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Semantic - method name;Syntactic - (TRANSIENT)"&gt;ToString&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fw-bold&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;feedItem&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Title&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Text&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;a&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;br&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;feedItem&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Summary&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Text&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;p&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;li&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;ul&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Pages/Shared/Components/Rss/FeedReader.cs&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name"&gt;System&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;ServiceModel&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Syndication&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name"&gt;System&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Xml&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;br /&gt;namespace&lt;/span&gt; &lt;span class="namespace name"&gt;CreatingWidgets&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Pages&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Shared&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Components&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Rss&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;FeedReader&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;Uri&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_rssFeed&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;FeedReader&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="class name"&gt;Uri&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;rssFeed&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name"&gt;_rssFeed&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;rssFeed&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;SyndicationFeed&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;Get&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;reader&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;XmlReader&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Create&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="field name"&gt;_rssFeed&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;AbsoluteUri&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;feed&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;SyndicationFeed&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Load&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;reader&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="local name"&gt;reader&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;Close&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;feed&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level two - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Pages/Shared/Components/Rss/RssWidgetModel.cs&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name"&gt;System&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;ServiceModel&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Syndication&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name"&gt;Tuxboard&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Core&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Infrastructure&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Models&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="keyword"&gt;namespace&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name"&gt;CreatingWidgets&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Pages&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Shared&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Components&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Rss&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;RssWidgetModel&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;WidgetModel&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;SyndicationFeed&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Feed&lt;/span&gt;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;int&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Limit&lt;/span&gt;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="brace pair level three - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="brace pair level one - punctuation;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;One of the first steps is creating the &lt;code&gt;RssViewComponent&lt;/code&gt; which accepts an instance of a &lt;code&gt;WidgetPlacement&lt;/code&gt; object.&lt;/p&gt;
&lt;p&gt;For convenience, we create a &lt;code&gt;FeedReader&lt;/code&gt; class so we can immediately consume the Stack Overflow RSS feed.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;RssWidgetModel&lt;/code&gt; passes the data onto the view (&lt;code&gt;default.cshtml&lt;/code&gt;). If you notice, we're allowing only 10 articles to display in the widget.&lt;/p&gt;
&lt;p&gt;Once passed in, the data is rendered with links and a summary of each post.&lt;/p&gt;
&lt;h3&gt;Step 2: Adding the Widget Record&lt;/h3&gt;
&lt;p&gt;With the RSS widget created, we can now focus on adding the record to the Tuxboard tables.&lt;/p&gt;
&lt;p&gt;The widget structure consists of the following tables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Widgets&lt;/strong&gt; - Contains the primary header for all widgets throughout Tuxboard&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WidgetDefault&lt;/strong&gt; - Using the WidgetID, contains all of the settings for the Widget&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WidgetDefaultOptions&lt;/strong&gt; - (optional) If a widget setting includes a dropdown, the options are defined as records here&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When a user adds a widget to their dashboard, these records are transformed from a &lt;code&gt;Widget&lt;/code&gt; record into a &lt;code&gt;WidgetPlacement&lt;/code&gt; record with corresponding default settings.&lt;/p&gt;
&lt;p&gt;Using &lt;a href="https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms" title="Go to Download SQL Server Management Studio on learn.microsoft.com"&gt;SSMS&lt;/a&gt; (SQL Server Management Studio), we can use SQL to insert a new record into the &lt;strong&gt;Widget table&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class="sqlcode"&gt;&lt;span class="keyword"&gt;INSERT&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;INTO&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;Widget&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;SELECT&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL System Function"&gt;newid&lt;/span&gt;&lt;span class="SQL Operator"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;WidgetId&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL String"&gt;'rss'&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;Name&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL String"&gt;'StackOverflow&amp;nbsp;Blog&amp;nbsp;RSS&amp;nbsp;Feed'&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;Title&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL String"&gt;'Latest&amp;nbsp;News&amp;nbsp;from&amp;nbsp;Stack&amp;nbsp;Overflow''s&amp;nbsp;Blog'&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;Description&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL String"&gt;''&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;ImageUrl&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL String"&gt;'Programming'&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;GroupName&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="number"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;Permission&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="number"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;Moveable&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="number"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;CanDelete&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="number"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;UseSetting&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="number"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;UseTemplate&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Here's a breakdown of the inserted record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WidgetID&lt;/strong&gt; - Auto-generated Identifier using the newid() function&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt; - The name of the widget used to identify the ViewComponent used. The name should match the ViewComponent attribute's name exactly (&lt;code&gt;[ViewComponent(name="rss")]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Title&lt;/strong&gt; - The title of the widget&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; - The description of the widget&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ImageUrl&lt;/strong&gt; - The image representing the widget; can be empty for no image since it's specifically for client-side icons.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GroupName&lt;/strong&gt; - Widget group's name when organizing your widgets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Permission&lt;/strong&gt; - Defaulted to 0; future enhancement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moveable&lt;/strong&gt; - Is the widget moveable on the dashboard? 1 for true, 0 for false.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CanDelete&lt;/strong&gt; - Can a user delete the widget? 1 for true, 0 for false.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UseSetting&lt;/strong&gt; - Does the widget contain settings? 1 for true, 0 for false. We'll get to this at a later time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UseTemplate&lt;/strong&gt; - Does the widget need a template?&lt;br /&gt;If 1, this creates the widget structure/border around the widget using the WidgetTemplate ViewComponent, then inserts the widget's body into the template (&lt;strong&gt;Standard&lt;/strong&gt; widgets)&lt;br /&gt;If 0, the widget will render without the widget heading/borders in the &lt;code&gt;WidgetTemplate&lt;/code&gt; ViewComponent (&lt;strong&gt;Static&lt;/strong&gt; widgets)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next is the &lt;strong&gt;WidgetDefault&lt;/strong&gt; table. Each widget should contain at least one setting, usually a widget title.&lt;/p&gt;
&lt;p&gt;Here's the SQL statement to add a Title setting to our RSS widget.&lt;/p&gt;
&lt;pre class="sqlcode"&gt;&lt;span class="keyword"&gt;INSERT&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;INTO&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;WidgetDefault&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;SELECT&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL System Function"&gt;newid&lt;/span&gt;&lt;span class="SQL Operator"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;WidgetDefaultId&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL String"&gt;'&amp;lt;EnterYourWidgetIdHere&amp;gt;'&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;WidgetId&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL String"&gt;'widgettitle'&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;SettingName&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL String"&gt;'Title'&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;SettingTitle&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="number"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;SettingType&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="SQL String"&gt;'Latest&amp;nbsp;News&amp;nbsp;from&amp;nbsp;Stack&amp;nbsp;Overflow'&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;DefaultValue&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="number"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;SettingIndex&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Again, let's break down each field to understand what's happening.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WidgetDefaultID&lt;/strong&gt; - Auto-generated Identifier using the &lt;code&gt;newid()&lt;/code&gt; function&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WidgetID&lt;/strong&gt; - This is the WidgetID from the widget header. Place the newly WidgetID from above here to associate the setting with the widget.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SettingName&lt;/strong&gt; - What is the programming name of the setting? This is unique name for each widget's setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SettingTitle&lt;/strong&gt; - The title of the setting. This will be used later when displaying widget settings (i.e. "Title:")&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SettingType&lt;/strong&gt; - The type of input for this widget setting. The default value is 0 for text input.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DefaultValue&lt;/strong&gt; - The default value for this setting. Since this is the title, the default value is "Latest News from Stack Overflow."&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SettingIndex&lt;/strong&gt; - The index of the setting in a list. This is important when displaying a list of settings for a user.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To confirm these records are connected properly, run this SQL statement.&lt;/p&gt;
&lt;pre class="sqlcode"&gt;&lt;span class="keyword"&gt;SELECT&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier"&gt;w&lt;/span&gt;&lt;span class="SQL Operator"&gt;.&lt;/span&gt;&lt;span class="keyword"&gt;Name&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier"&gt;w&lt;/span&gt;&lt;span class="SQL Operator"&gt;.&lt;/span&gt;&lt;span class="identifier"&gt;Title&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier"&gt;w&lt;/span&gt;&lt;span class="SQL Operator"&gt;.&lt;/span&gt;&lt;span class="keyword"&gt;Description&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier"&gt;wd&lt;/span&gt;&lt;span class="SQL Operator"&gt;.&lt;/span&gt;&lt;span class="identifier"&gt;SettingTitle&lt;/span&gt;&lt;span class="SQL Operator"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier"&gt;wd&lt;/span&gt;&lt;span class="SQL Operator"&gt;.&lt;/span&gt;&lt;span class="identifier"&gt;DefaultValue&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;FROM&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;Widget&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;w&lt;/span&gt;&lt;br /&gt;&lt;span class="SQL Operator"&gt;JOIN&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;WidgetDefault&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;wd&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;on&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;wd&lt;/span&gt;&lt;span class="SQL Operator"&gt;.&lt;/span&gt;&lt;span class="identifier"&gt;WidgetId&lt;/span&gt;&lt;span class="SQL Operator"&gt;=&lt;/span&gt;&lt;span class="identifier"&gt;w&lt;/span&gt;&lt;span class="SQL Operator"&gt;.&lt;/span&gt;&lt;span class="identifier"&gt;WidgetId&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;WHERE&lt;/span&gt;&amp;nbsp;&lt;span class="identifier"&gt;w&lt;/span&gt;&lt;span class="SQL Operator"&gt;.&lt;/span&gt;&lt;span class="identifier"&gt;WidgetId&lt;/span&gt;&lt;span class="SQL Operator"&gt;=&lt;/span&gt;&lt;span class="SQL String"&gt;'&amp;lt;YourWidgetIdHere&amp;gt;'&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The SQL statement above is definitely reusable for validating settings for a widget.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-new-rss-widget.jpg" alt="Screenshot of SQL Server results for display widgets with their settings" title="Screenshot of SQL Server results for display widgets with their settings" class="img-fluid no-float" /&gt;&lt;/p&gt;
&lt;p&gt;If everything looks good, users can add the latest widget to their dashboard.&lt;/p&gt;
&lt;h2&gt;Troubleshooting&lt;/h2&gt;
&lt;p&gt;While that's everything required to add a widget, there could be some problems. Let's look at some common issues (I know there's only one, but more will be added as they're asked).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;If the widget isn't appearing in the "Add Widget Dialog"&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;It may be missing from the Widget table. Review this post to insert the widget and widget settings.&lt;/li&gt;
&lt;li&gt;They may not have permissions to add the widget to their dashboard. Review the previous post under the section titled "&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Updating the Database&lt;/a&gt;" to insert your new widget for all users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Viewing the Results&lt;/h2&gt;
&lt;p&gt;With our RSS widget now in place, users can add the widget to see the latest news from Stack Overflow.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-rss-results.jpg" alt="Screenshot of the Latest News from Stack Overflow Widget" title="Screenshot of the Latest News from Stack Overflow Widget" class="img-fluid no-float" /&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this post, we created a simple widget for users to view the latest news from Stack Overflow through an RSS feed.&lt;/p&gt;
&lt;p&gt;The best part of this post is we'll continue to build and extend this example to show other features of Tuxboard like widget settings and how to defer rendering.&lt;/p&gt;
&lt;p&gt;The repository for this post is the &lt;strong&gt;&lt;a href="https://github.com/jdanylko/Tuxboard.Examples/tree/master/12-Creating-Widgets" title="Go to 12-Creating-Widgets on github.com"&gt;12-Creating-Widgets&lt;/a&gt;&lt;/strong&gt; at &lt;strong&gt;&lt;a href="https://github.com/jdanylko/Tuxboard.Examples" title="Go to Tuxboard.Examples on github.com"&gt;Tuxboard.Examples&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Go to Creating Default Widgets using Roles"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;&lt;ul class="list-inline link-list"&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://www.linkedin.com/in/jonathandanylko" title="LinkedIn Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/linkedin_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://twitter.com/jdanylko" title="Twitter Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/twitter_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://instagram.com/jdanylko" title="Instagram Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/instagram-16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jonathan "JD" Danylko is an author, web architect, and entrepreneur who's been programming for over 30 years. He's developed websites for small, medium, and Fortune 500 companies since 1996.&lt;/p&gt;
&lt;p&gt;He currently works at &lt;a href="https://www.danylkoweb.com/Blog/growing-up-with-insight-O4" title="Go to Growing up with Insight"&gt;Insight Enterprises&lt;/a&gt; as an Architect.&lt;/p&gt;
&lt;p&gt;When asked what he likes to do in his spare time, he replies, "I like to write and I like to code. I also like to write about code."&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Wed, 04 Sep 2024 00:00:00 -0700</pubDate></item><item><guid isPermaLink="false">5ee86de3-0cf7-4495-9101-3406609ffbfc</guid><link>https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA</link><title>Creating Default Widgets using Roles</title><description>&lt;p&gt;By Jonathan "JD" Danylko&lt;/p&gt;&lt;p&gt;&lt;strong&gt;In today's post, we'll continue to use Identity to create widgets for specific roles&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-default-widgets.jpg" alt="Hundreds of Nuts" title="Only specific nuts fit specific bolts" class="img-fluid no-float" width="640" height="360" /&gt;&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Creating Default Widgets using Roles&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB" title="Go to Creating Custom Tuxboard Widgets"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In the last &lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards using Roles"&gt;post&lt;/a&gt;, we created default dashboards for specific roles. When a new user is added, default dashboards make the onboarding easier for a user.&lt;/p&gt;
&lt;p&gt;One feature of Tuxboard is the ability to deliver role-specific widgets. Role-based widgets can be administrative, standard, or simple informative.&lt;/p&gt;
&lt;p&gt;In today's post, we'll demonstrate how to leverage those roles in delivering role-specific widgets to users. The widgets are filtered on the server and delivered to the user through the &lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Add Widgets dialog&lt;/a&gt;. The good news for backend developers is no client-side code is necessary to update.&lt;/p&gt;
&lt;p&gt;The process is similar to the previous &lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards using Roles"&gt;post&lt;/a&gt; of creating default dashboards, but at a widget level.&lt;/p&gt;
&lt;h2&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;The project we'll be working with is located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples" title="Go to Tuxboard.Examples on github.com"&gt;Tuxboard.Examples&lt;/a&gt; called &lt;strong&gt;11-Default-Widgets&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Again, we need to setup the project so we can see how it runs and then follow along of how the project was built.&lt;/p&gt;
&lt;p&gt;To get started with the finished project,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Right-click on the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;file and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;em&gt;Restore Packages&lt;/em&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;so the client-side JavaScript/TypeScript will work as expected.&lt;/li&gt;
&lt;li&gt;Open the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;appsettings.json&lt;/code&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;file and update the connection string.&lt;/li&gt;
&lt;li&gt;Open the Package Manager Console (&lt;em&gt;View &amp;gt; Other Windows... &amp;gt; Package Manager Console&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Confirm you have the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;11-Default-Widgets&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;project selected in the Default Project Dropdown in the Package Manager Console.&lt;/li&gt;
&lt;li&gt;Since we already have a migration in place, type&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;code&gt;update-database -Context TuxboardRoleDbContext&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After updating the database,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;users and their roles are the only things missing to complete this demonstration&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;As mentioned in the post before under the "&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards using Roles"&gt;Configuring the Database&lt;/a&gt;" section, register your users and assign each one a role before moving forward.&lt;/p&gt;
&lt;h2&gt;Creating the WidgetRole Entity&lt;/h2&gt;
&lt;p&gt;The WidgetRole entity is meant to be an associative (or junction) table. The entity is defined as follows:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;WidgetRole&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;WidgetId&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;RoleId&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Widget&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Widget&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;default&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRole&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Role&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;default&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Once we have the entity, we need to add our WidgetRole to the TuxboardRoleDbContext.&lt;/p&gt;
&lt;p&gt;First, we need a &lt;code&gt;WidgetRoleConfiguration&lt;/code&gt; in our &lt;code&gt;Data\Configuration&lt;/code&gt; directory.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;WidgetRoleConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IEntityTypeConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;WidgetRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;void&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;Configure&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;EntityTypeBuilder&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;WidgetRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;builder&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ToTable&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - keyword;Semantic - (TRANSIENT)"&gt;nameof&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;WidgetRole&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;HasKey&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;r&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;r&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;WidgetId&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;r&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;RoleId&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;div class="alert alert-info" role="alert"&gt;
&lt;h4 class="alert-heading"&gt;Quick Tip&lt;/h4&gt;
&lt;hr /&gt;
&lt;p class="mb-0"&gt;We define the table with a &lt;code&gt;nameof(WidgetRole)&lt;/code&gt;. The nameof() function creates a string version of our class. It produces the same as &lt;code&gt;builder.ToTable("WidgetRole")&lt;/code&gt;, but is more type-safe without "magic strings."&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Next, we need to add a &lt;code&gt;DbSet&lt;/code&gt; to the &lt;code&gt;TuxboardRoleDbContext&lt;/code&gt;. First, through the interface (changes in &lt;strong&gt;bold&lt;/strong&gt;).&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;interface&lt;/span&gt;&amp;nbsp;&lt;span class="interface name"&gt;ITuxboardRoleDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ITuxDbContext&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboard&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;RoleDefaultDashboards&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;WidgetRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;WidgetRoles&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/strong&gt;.&lt;br /&gt;. 
&lt;/pre&gt;
&lt;p&gt;Then, we add the &lt;code&gt;DbSet&amp;lt;WidgetRole&amp;gt;&lt;/code&gt; to our concrete class &lt;code&gt;TuxboardRoleDbContext&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardRoleDbContext&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ITuxboardRoleDbContext&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardRoleDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbContextOptions&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;options&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IOptions&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardConfig&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;config&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;base&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;options&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;config&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboard&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;RoleDefaultDashboards&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt; &amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;WidgetRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;WidgetRoles&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/strong&gt;.&lt;br /&gt;.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/pre&gt;
&lt;p&gt;In the &lt;code&gt;OnModelCreating&lt;/code&gt;, don't forget to add the &lt;code&gt;WidgetRoleConfiguration()&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;WidgetRoleConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;h2&gt;Creating the Service&lt;/h2&gt;
&lt;p&gt;Since we have the WidgetRole table, our focus is now the service and how to pull the widgets based on a role.&lt;/p&gt;
&lt;p&gt;The interface is meant to be as simple as the &lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards using Roles"&gt;RoleDashboardService&lt;/a&gt; from before.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;interface&lt;/span&gt;&amp;nbsp;&lt;span class="interface name"&gt;IWidgetRoleService&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;List&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Widget&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;GetWidgetsByRoleAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;List&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Widget&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;GetDefaultWidgetsAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;GetWidgetsByRoleAsync()&lt;/code&gt; retrieves the widgets based on a user's role, but what about the &lt;code&gt;GetDefaultWidgetsAsync()&lt;/code&gt;? This concept is similar to how a user logs in and is given either a role-specific dashboard or a default dashboard. If they're a registered user, they should receive a dashboard.&lt;/p&gt;
&lt;p&gt;The same concept applies to widgets. If they are a registered user, but don't have a role, they should receive a collection of widgets to add to their dashboard.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;WidgetRoleService&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IWidgetRoleService&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ITuxboardRoleDbContext&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_context&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;UserManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_userManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_roleManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;WidgetRoleService&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ITuxboardRoleDbContext&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;UserManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;userManager&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;roleManager&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_context&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;context&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_userManager&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;userManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_roleManager&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;roleManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;List&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Widget&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;GetWidgetsByRoleAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;Give&amp;nbsp;them&amp;nbsp;something&amp;nbsp;at&amp;nbsp;least.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;result&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDefaultWidgetsAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;roleName&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetRoles&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;roleName&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;result&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;role&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_roleManager&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;FindByNameAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;roleName&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;role&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;result&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;WidgetRoles&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Include&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Widget&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Where&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;RoleId&lt;/span&gt;&amp;nbsp;&lt;span class="operator;Semantic - operator - overloaded;Semantic - (TRANSIENT)"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;role&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Select&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;r&lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;r&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Widget&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ToListAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;List&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Widget&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;GetDefaultWidgetsAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;Set&amp;nbsp;up&amp;nbsp;your&amp;nbsp;own&amp;nbsp;GroupName&amp;nbsp;like&amp;nbsp;"Standard"&amp;nbsp;or&amp;nbsp;something.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Widgets&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Where&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;GroupName&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"Example"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ToListAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;GetRoles&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;*COULD*&amp;nbsp;have&amp;nbsp;more&amp;nbsp;than&amp;nbsp;one&amp;nbsp;role;&amp;nbsp;we&amp;nbsp;just&amp;nbsp;want&amp;nbsp;the&amp;nbsp;first&amp;nbsp;one.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;roles&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_userManager&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetRolesAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;roles&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Count&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="number"&gt;1&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;roles&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;GetWidgetsByRoleAsync()&lt;/code&gt; takes a TuxboardUser and immediately retrieves the default widgets for unregistered users or users without a role. In this case, widgets in the GroupName called "Example" are the default widgets presented to the user.&lt;/p&gt;
&lt;p&gt;If they're a registered user and have a role, then the user is presented with a list of role-specific widgets in the dialog.&lt;/p&gt;
&lt;p&gt;With the list of role-specific widgets, we can move up a level to the Add Widgets dialog in our Index page.&lt;/p&gt;
&lt;h2&gt;Dependency Injecting the WidgetRoleService&lt;/h2&gt;
&lt;p&gt;Before we head over to the Index page, we need to add our new service to our Middleware in the &lt;code&gt;Program.cs&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Services&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;AddTransient&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IWidgetRoleService&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;WidgetRoleService&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Once we update our &lt;code&gt;Program.cs&lt;/code&gt;, we can move on to the Index page.&lt;/p&gt;
&lt;h2&gt;Updating the Add Widget Dialog&lt;/h2&gt;
&lt;p&gt;In the Index page, we need to inject our WidgetRoleService through the constructor (changes in &lt;strong&gt;bold&lt;/strong&gt;).&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;IndexModel&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;PageModel&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ILogger&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IndexModel&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - field name;Semantic - (TRANSIENT)"&gt;_logger&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_service&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IRoleDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_roleDashboardService&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IWidgetRoleService&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_widgetRoleService&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;UserManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_userManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardConfig&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_config&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;bool&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;HasDashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;IndexModel&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ILogger&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IndexModel&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;logger&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;service&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IRoleDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;roleDashboardService&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IWidgetRoleService&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;widgetRoleService&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;UserManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;userManager&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IOptions&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardConfig&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;options&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_logger&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;logger&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;service&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_roleDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;roleDashboardService&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_widgetRoleService&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;widgetRoleService&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_userManager&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;userManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_config&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;options&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Value&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;br /&gt;.&lt;br /&gt;.&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Once we're able to inject the service into the Index page, the &lt;code&gt;OnPostAddWidgetsDialog()&lt;/code&gt; method is easier to implement.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IActionResult&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;OnPostAddWidgetsDialog&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;List&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;WidgetDto&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;widgets&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;id&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetIdentity&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&amp;nbsp;&lt;span class="operator;Semantic - operator - overloaded;Semantic - (TRANSIENT)"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;user&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetTuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;widgets&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;AddRange&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_widgetRoleService&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetWidgetsByRoleAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Select&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;r&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;r&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ToDto&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ToList&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;else&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;widgets&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;AddRange&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_widgetRoleService&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDefaultWidgetsAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Select&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;r&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;r&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ToDto&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ToList&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ViewComponent&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"addwidgetdialog"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;AddWidgetModel&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Widgets&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;widgets&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt; 
&lt;/pre&gt;
&lt;p&gt;Let's walk through the method.&lt;/p&gt;
&lt;p&gt;We initialize the list of widgets to return to the Add Widgets Dialog as empty (for now).&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;GetIdentity()&lt;/code&gt; retrieves the current user logged in.&lt;/p&gt;
&lt;p&gt;Since we're retrieving the user in multiple places throughout the code, it made sense to create a new method to grab a TuxboardUser.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;GetTuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_userManager&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;FindByIdAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ToString&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;If the user is logged in, get the widgets by the user's role. If they aren't logged in, return a list of default widgets. Whether logged in or not, we receive a list of widgets and convert them into DTOs (Data Transfer Objects) for our Add Widget Dialog.&lt;/p&gt;
&lt;p&gt;The good news is we simply modified the way a user retrieves widgets based on their roles. Once we have the widget DTOs, we pass them on to the &lt;code&gt;AddWidgetDialogViewComponent&lt;/code&gt; to render and send the view back to the client.&lt;/p&gt;
&lt;h2&gt;Updating the Database&lt;/h2&gt;
&lt;p&gt;The best way to present widgets to users is to take a hard look at the roles and identify which widgets are meant for privileged users and standard users.&lt;/p&gt;
&lt;p&gt;If all users are meant to have any widget, insert all of the widgets and roles through SQL.&lt;/p&gt;
&lt;pre class="sqlcode"&gt;INSERT INTO WidgetRole
SELECT
    w.WidgetId,
    tr.Id as RoleId
FROM Widget w
join TuxboardRole tr on 1=1
&lt;/pre&gt;
&lt;p&gt;The SQL above will add all widgets to every role.&lt;/p&gt;
&lt;p&gt;Once all WidgetRoles are entered into the table, double-check the table by using the following SQL statement.&lt;/p&gt;
&lt;pre class="sqlcode"&gt;SELECT
   tr.Name,
   w.Name,
   w.Title,
   w.GroupName
FROM WidgetRole wr
join Widget w on w.WidgetId=wr.WidgetId
join TuxboardRole tr on tr.Id=wr.RoleId
&lt;/pre&gt;
&lt;table class="table table-striped table-responsive"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;GroupName&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;helloworld&lt;/td&gt;
&lt;td&gt;Hello World&lt;/td&gt;
&lt;td&gt;Example&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admin&lt;/td&gt;
&lt;td&gt;table&lt;/td&gt;
&lt;td&gt;Sample Table&lt;/td&gt;
&lt;td&gt;General&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admin&lt;/td&gt;
&lt;td&gt;generalinfo&lt;/td&gt;
&lt;td&gt;General Info&lt;/td&gt;
&lt;td&gt;General&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admin&lt;/td&gt;
&lt;td&gt;helloworld&lt;/td&gt;
&lt;td&gt;Hello World&lt;/td&gt;
&lt;td&gt;Example&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The SQL results are meant to show an easy view of the roles and their associated widgets. In this example, basic users are only able to add a Hello World widget, but administrators are able to add all widgets.&lt;/p&gt;
&lt;h2&gt;Viewing The Results&lt;/h2&gt;
&lt;p&gt;When we run the application and log in as an administrator and use the Add Widget dialog, we can see the following results.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-all-widgets.jpg" alt="Screenshot of the Add Widget dialog for an administrator" title="Screenshot of the Add Widget dialog for an administrator" class="img-fluid no-float" width="640" height="298" /&gt;&lt;/p&gt;
&lt;p&gt;However, if we log in as a basic user and want to add a widget to the dashboard, our widget list is limited.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-standard-widgets.jpg" alt="Screenshot of the Add Widget dialog for the user Bob" title="Screenshot of the Add Widget dialog for the user Bob" class="img-fluid no-float" width="640" height="287" /&gt;&lt;/p&gt;
&lt;p&gt;Providing specific widgets based on a user's role demonstrates Tuxboard's unique approach to dashboards.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;While we focused on role-based widgets and default dashboards, the goal of these two past posts were meant to show the flexibility of Tuxboard and how to expand on it's ability to adapt to other concepts, but still keep the dashboard robust and maintainable.&lt;/p&gt;
&lt;p&gt;The original concept was to introduce subscriber plans to Tuxboard for the initial design. The Plan and WidgetPlan table along with the DashboardDefault's PlanID field was created for inspiring developer/entrepreneurs to integrate a consumer-based dashboard into a product. They were originally intended for subscriber plans. This was touched on in the last &lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards using Roles"&gt;post&lt;/a&gt; (under "Configuring the Database").&lt;/p&gt;
&lt;p&gt;Based on these two posts, we were able to demonstrate how Tuxboard uses a role-based approach as easily as a subscriber plan approach.&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Creating Default Widgets using Roles&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB" title="Go to Creating Custom Tuxboard Widgets"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;ul class="list-inline link-list"&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://www.linkedin.com/in/jonathandanylko" title="LinkedIn Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/linkedin_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://twitter.com/jdanylko" title="Twitter Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/twitter_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://instagram.com/jdanylko" title="Instagram Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/instagram-16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jonathan "JD" Danylko is an author, web architect, and entrepreneur who's been programming for over 30 years. He's developed websites for small, medium, and Fortune 500 companies since 1996.&lt;/p&gt;
&lt;p&gt;He currently works at &lt;a href="https://www.danylkoweb.com/Blog/growing-up-with-insight-O4" title="Go to Growing up with Insight"&gt;Insight Enterprises&lt;/a&gt; as an Architect.&lt;/p&gt;
&lt;p&gt;When asked what he likes to do in his spare time, he replies, "I like to write and I like to code. I also like to write about code."&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Fri, 23 Aug 2024 00:00:00 -0700</pubDate></item><item><guid isPermaLink="false">bf38ae6d-fb13-4ed8-b8d7-e71efddc5924</guid><link>https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8</link><title>Creating Default Dashboards using Roles</title><description>&lt;p&gt;By Jonathan "JD" Danylko&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Today, we demonstrate how to create default dashboards in Tuxboard based on a user's role&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-default-dashboard-actors.jpg" title="Adding roles to our default dashboards" alt="Two actors in a role at a bar" class="img-fluid no-float" width="640" height="427" /&gt;&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Creating Default Dashboards using Roles&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB" title="Go to Creating Custom Tuxboard Widgets"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In the last &lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;post&lt;/a&gt;, we demonstrated how to create user-specific dashboards for any user signing in and providing standard widgets for every user.&lt;/p&gt;
&lt;p&gt;However, what if you have different user permissions? If we include administrative widgets in a standard user's dashboard, we may have some problems down the road.&lt;/p&gt;
&lt;p&gt;In today's post, we'll look at how to create default dashboards for different roles using Microsoft Identity. While this technique is focusing on Microsoft Identity, it can easily be modified to work with other security frameworks like &lt;a href="https://entra.microsoft.com/" title="Go to Microsoft Entra at entra.microsoft.com"&gt;Microsoft Entra&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The example we'll review is in the &lt;em&gt;10-Default-Dashboards&lt;/em&gt; folder. &lt;strong&gt;The &lt;em&gt;10-Default-Dashboards&lt;/em&gt; project has already gone through all of these steps&lt;/strong&gt;. All that's required to run is the initial setup and migrations.&lt;/p&gt;
&lt;h2&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;As always, there is a repository available of everything we'll cover in this post at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples" title="Go to Tuxboard.Examples on github.com"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At first, we'll setup the project so we can see how it runs and then follow along of how the project was built.&lt;/p&gt;
&lt;p&gt;To get started with the finished project,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Right-click on the &lt;code&gt;package.json&lt;/code&gt; file and &lt;em&gt;Restore Packages&lt;/em&gt; so the client-side JavaScript/TypeScript will work as expected.&lt;/li&gt;
&lt;li&gt;Open the &lt;code&gt;appsettings.json&lt;/code&gt; file and update the connection string.&lt;/li&gt;
&lt;li&gt;Open the Package Manager Console (&lt;em&gt;View &amp;gt; Other Windows... &amp;gt; Package Manager Console&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Confirm you have the &lt;strong&gt;10-Default-Dashboards&lt;/strong&gt; project selected in the Default Project Dropdown in the Package Manager Console.&lt;/li&gt;
&lt;li&gt;Since we already have a migration in place, type &lt;code&gt;update-database -Context TuxboardRoleDbContext&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After updating the database, &lt;strong&gt;users and their roles are the only things missing to complete this demonstration&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you'd like to fast-forward to creating the users and roles, jump down to the "Configuring the Database" section to successfully run the project.&lt;/p&gt;
&lt;p&gt;With that said, we can now review the project to understand how to create default dashboards in our own projects.&lt;/p&gt;
&lt;h2&gt;Understanding Default Dashboards&lt;/h2&gt;
&lt;p&gt;Default dashboards are meant to give a specific dashboard and/or collection of widgets to different types of users. If a user logged into a website and were given a blank screen, it wouldn't be a very good experience for the user, would it?&lt;/p&gt;
&lt;p&gt;Since we only have a single widget/default dashboard available, we may want to add a dashboard for new users with a tutorial widget or a Getting Started widget. If they're an administrator, they would want to see a statistics widget on how many users logged in for the day, what notifications happened since the last log in, or even a to-do list.&lt;/p&gt;
&lt;p&gt;In the database, the tables to focus on are the DefaultDashboard and Layout tables.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;DefaultDashboard&lt;/strong&gt;&amp;nbsp;table provides a LayoutID and PlanID. Originally, the Tuxboard schema was meant for subscription plans (&lt;em&gt;DefaultDashboard table&lt;/em&gt;) and widgets available based on a plan (&lt;em&gt;WidgetPlan table&lt;/em&gt;). Since we're using roles with Identity, we won't be using the PlanID field in the DefaultDashboard table or the WidgetPlan table.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Layout&lt;/strong&gt; table is what's important. &lt;em&gt;&lt;strong&gt;If there is a null in the TabID, it's a Default Dashboard layout of some kind&lt;/strong&gt;&lt;/em&gt;. Every time a user logs in, they're given a TabID for their dashboard and a layout is assigned to the tab. Basically, an empty TabID means it doesn't belong to a user.&lt;/p&gt;
&lt;p&gt;After running the update-database command, two default dashboard records are added and two layout records are added.&lt;/p&gt;
&lt;p&gt;The last piece we need for this project is the Roles &amp;lt;-&amp;gt; DefaultDashboard relationship which we'll get into in a bit.&lt;/p&gt;
&lt;h2&gt;Adding Identity Models&lt;/h2&gt;
&lt;p&gt;Once we copied everything over from the &lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Creating User-Specific Dashboards"&gt;user-specific dashboards&lt;/a&gt; project to create our new project, we're ready to use Microsoft Identity immediately.&lt;/p&gt;
&lt;p&gt;Unfortunately, there is an issue with our schema: the DefaultDashboard table uses a GUID and the Roles table in the Identity schema uses a string by default so we need to adjust our Identity models to match what we need.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardUser&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IdentityUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardUserClaim&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IdentityUserClaim&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardUserLogin&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IdentityUserLogin&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardUserRole&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IdentityUserRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardUserToken&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IdentityUserToken&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardUserStore&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;UserStore&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRole&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRoleDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserClaim&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserRole&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserLogin&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserToken&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRoleClaim&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardRole&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IdentityRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardRoleClaim&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IdentityRoleClaim&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardRoleStore&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleStore&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRole&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRoleDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserRole&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRoleClaim&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;These models were created based on the Identity post on learn.microsoft.com called &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/security/authentication/customize-identity-model?view=aspnetcore-8.0" title="Go to Identity Model Customization on learn.microsoft.com"&gt;Identity Model Customization&lt;/a&gt;. Based on the above class signatures, we need a &lt;code&gt;TuxboardRoleDbContext&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;interface&lt;/span&gt;&amp;nbsp;&lt;span class="interface name"&gt;ITuxboardRoleDbContext&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ITuxDbContext&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboard&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboards&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="comment"&gt;//&amp;nbsp;Identity&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserClaim&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardUserClaims&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardUserRoles&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserLogin&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardUserLogins&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserToken&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardUserTokens&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardUsers&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardRoles&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRoleClaim&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardRoleClaims&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardRoleDbContext&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ITuxboardRoleDbContext&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardRoleDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbContextOptions&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;options&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IOptions&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardConfig&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;config&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;base&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;options&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;config&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboard&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboards&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &amp;nbsp;&amp;nbsp; &lt;span class="comment"&gt;//&amp;nbsp;Identity&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserClaim&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardUserClaims&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardUserRoles&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserToken&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardUserTokens&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserLogin&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardUserLogins&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardUsers&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardRoles&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DbSet&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRoleClaim&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - property name;Semantic - (TRANSIENT)"&gt;TuxboardRoleClaims&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;void&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;OnModelCreating&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ModelBuilder&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;modelBuilder&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;base&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;OnModelCreating&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboardConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DashboardLayoutConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DashboardLayoutRowConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DashboardDefaultConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DashboardDefaultWidgetConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="comment"&gt;//&amp;nbsp;Identity&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRoleConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRoleClaimConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserClaimConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserLoginConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserRoleConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;modelBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ApplyConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUserTokenConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Even though the &lt;code&gt;TuxboardRoleDbContext&lt;/code&gt; is small, there is a lot to unpack here along with some interesting insights.&lt;/p&gt;
&lt;h3&gt;Multiple DbContexts into One&lt;/h3&gt;
&lt;p&gt;In regards to Entity Framework DbContexts, it's recommended to minimize the number of DbContext's used in an application. As a matter of fact, if you can get away with one DbContext, it's for the best. It also makes it easier to track entity state changes.&lt;/p&gt;
&lt;p&gt;Since we already have a &lt;code&gt;TuxDbContext&lt;/code&gt;, how could we "attach" Identity models to the existing DbContext?&lt;/p&gt;
&lt;p&gt;Simple. Add the &lt;code&gt;DbSet&lt;/code&gt;s and Configurations for each Identity models in the inherited DbContext.&lt;/p&gt;
&lt;p&gt;One of the shockers (for me anyways) was the ability to attach Identity models to an existing DbContext and have it work as expected instead of having one &lt;code&gt;DbContext&lt;/code&gt; for &lt;code&gt;TuxDbContext&lt;/code&gt; and one for Identity.&lt;/p&gt;
&lt;h3&gt;Inheriting Aggregates Configurations&lt;/h3&gt;
&lt;p&gt;The configurations was another shock as to the power of Entity Framework Core.&lt;/p&gt;
&lt;p&gt;For the standard Tuxboard configurations above, we are simply adding additional records to each table. While we already had Tuxboard configurations in the base &lt;code&gt;TuxDbContext&lt;/code&gt; class, we're adding more configurations for additional Layout and LayoutRow records.&lt;/p&gt;
&lt;p&gt;When we did a migration of the new &lt;code&gt;TuxboardRoleDbContext&lt;/code&gt;, &lt;em&gt;all&lt;/em&gt; configurations were combined into one making the records inserted as one batch.&lt;/p&gt;
&lt;p&gt;For example, the &lt;code&gt;DashboardLayoutConfiguration&lt;/code&gt; class above consists of the following code.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;DashboardLayoutConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IEntityTypeConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Layout&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;void&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;Configure&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;EntityTypeBuilder&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Layout&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;builder&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;HasData&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;List&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Layout&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;LayoutId&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"239C89ED-3310-40D8-9104-237659415392"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;TabId&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;LayoutIndex&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="number"&gt;1&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;However, when the migration finished, the code consisted of the following code.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;migrationBuilder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;InsertData&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;schema&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"dbo"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;table&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"Layout"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;columns&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - UnnecessaryCodeDiagnostic - keyword;Semantic - (TRANSIENT)"&gt;new&lt;/span&gt;&lt;span class="ReSharper Dead Code - UnnecessaryCodeDiagnostic - punctuation;Semantic - (TRANSIENT)"&gt;[&lt;/span&gt;&lt;span class="ReSharper Dead Code - UnnecessaryCodeDiagnostic - punctuation;Semantic - (TRANSIENT)"&gt;]&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"LayoutId"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"LayoutIndex"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"TabId"&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;values&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span class="punctuation"&gt;[&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - struct name;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"239c89ed-3310-40d8-9104-237659415392"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - struct name;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"5267da05-afe4-4753-9cee-d5d32c2b068e"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;It used the &lt;code&gt;.HasData()&lt;/code&gt; method from &lt;em&gt;both&lt;/em&gt; the &lt;code&gt;TuxDbContext&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; &lt;code&gt;TuxboardRoleDbContext&lt;/code&gt;.&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Creating the Junction/Association Table&lt;/h2&gt;
&lt;p&gt;While integrating Identity into the existing TuxDbContext was a happy experience, we need to focus on our target: associating a role to a default dashboard.&lt;/p&gt;
&lt;p&gt;For those who were paying attention, there was a &lt;code&gt;DbSet&lt;/code&gt; called &lt;code&gt;RoleDefaultDashboards&lt;/code&gt; in our new &lt;code&gt;TuxboardRoleDbContext&lt;/code&gt;. This is our junction table and the model is based on the following code.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;RoleDefaultDashboard&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;DefaultDashboardId&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;RoleId&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DashboardDefault&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;DefaultDashboard&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;default&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRole&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Role&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;default&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;RoleDefaultDashboardConfiguration&lt;/code&gt; class consists of the code below.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;RoleDefaultDashboardConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IEntityTypeConfiguration&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboard&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;void&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;Configure&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;EntityTypeBuilder&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboard&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;builder&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;HasKey&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;r&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;r&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;DefaultDashboardId&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;r&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;RoleId&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;HasData&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;List&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboard&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;RoleId&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"7E69EB1F-07C0-46A1-B4E8-86F56386C250"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;Admin&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;DefaultDashboardId&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"0D96A18E-90B8-4A9F-9DF1-126653D68FE6"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;Admin&amp;nbsp;Dashboard&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;RoleId&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"31C3DF95-FDC6-4FB5-82AB-0436EA93C1B1"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;Basic&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;DefaultDashboardId&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"1623F469-D9F0-400C-8A4C-B4366233F485"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;Basic&amp;nbsp;dashboard&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;One thing missing is how we load our dashboard based on a user's role...which brings us to our &lt;code&gt;RoleDashboardService&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;interface&lt;/span&gt;&amp;nbsp;&lt;span class="interface name"&gt;IRoleDashboardService&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DashboardDefault&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - method name;Semantic - (TRANSIENT)"&gt;GetDashboardTemplateByRoleAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;bool&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - method name;Semantic - (TRANSIENT)"&gt;DashboardExistsForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;userId&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;RoleDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IRoleDashboardService&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ITuxboardRoleDbContext&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_context&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;UserManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_userManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_roleManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;RoleDashboardService&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ITuxboardRoleDbContext&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;context&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;UserManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;userManager&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RoleManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardRole&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;roleManager&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_context&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;context&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_userManager&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;userManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_roleManager&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;roleManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;bool&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - method name;Semantic - (TRANSIENT)"&gt;DashboardExistsForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;userId&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DashboardExistsForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;userId&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DashboardDefault&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - method name;Semantic - (TRANSIENT)"&gt;GetDashboardTemplateByRoleAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DashboardDefault&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;defaultDashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;roleName&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetRoles&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;roleName&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;defaultDashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;GetDashboardTemplateForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;role&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_roleManager&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;FindByNameAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;roleName&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;role&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;defaultDashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;??&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;GetDashboardTemplateForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;roleDashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;RoleDefaultDashboards&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;FirstOrDefaultAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;RoleId&lt;/span&gt;&amp;nbsp;&lt;span class="operator;Semantic - operator - overloaded;Semantic - (TRANSIENT)"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;role&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;roleDashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;defaultDashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="ReSharper Dead Code - punctuation;Semantic - (TRANSIENT)"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;GetDashboardDefaultAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;roleDashboard&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;DefaultDashboardId&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="ReSharper Dead Code - punctuation;Semantic - (TRANSIENT)"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;??&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;defaultDashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;??&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_context&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;GetDashboardTemplateForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;GetRoles&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;*COULD*&amp;nbsp;have&amp;nbsp;more&amp;nbsp;than&amp;nbsp;one&amp;nbsp;role;&amp;nbsp;we&amp;nbsp;just&amp;nbsp;want&amp;nbsp;the&amp;nbsp;first&amp;nbsp;one.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;roles&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_userManager&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetRolesAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;roles&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Count&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="number"&gt;1&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;roles&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;GetDashboardTemplateByRoleAsync()&lt;/code&gt; method is what performs the heavy lifting for our service.&lt;/p&gt;
&lt;p&gt;First, we check to see if the user is associated with any roles from Identity. If they don't have a role associated to them, we load the default dashboard.&lt;/p&gt;
&lt;p&gt;Next, we located the role name. If we don't return a role, again, we load the default dashboard.&lt;/p&gt;
&lt;p&gt;We, then, check to see if there is an existing dashboard associated with a role. If not, once again, we load the default dashboard. If there &lt;em&gt;is&lt;/em&gt; a default dashboard assigned to a role, return it.&lt;/p&gt;
&lt;p&gt;The concept behind this method is to &lt;em&gt;always&lt;/em&gt; return a default dashboard.&lt;/p&gt;
&lt;h2&gt;Calling the RoleDashboardService&lt;/h2&gt;
&lt;p&gt;With our newly created &lt;code&gt;RoleDashboardService&lt;/code&gt; created, we can add it to our &lt;code&gt;Index.cshtml.cs&lt;/code&gt; file (changes in &lt;strong&gt;bold&lt;/strong&gt;).&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;IndexModel&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;PageModel&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ILogger&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IndexModel&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - field name;Semantic - (TRANSIENT)"&gt;_logger&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_service&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IRoleDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_roleDashboardService&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;UserManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_userManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;readonly&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardConfig&lt;/span&gt;&amp;nbsp;&lt;span class="field name"&gt;_config&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;bool&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;HasDashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - property name;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;IndexModel&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ILogger&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;IndexModel&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;logger&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;service&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IRoleDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;roleDashboardService&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;UserManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;userManager&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IOptions&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardConfig&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;options&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_logger&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;logger&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;service&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_roleDashboardService&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;roleDashboardService&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_userManager&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;userManager&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_config&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;options&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - property name;Semantic - (TRANSIENT)"&gt;Value&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;OnGet&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;id&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetIdentity&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&amp;nbsp;&lt;span class="operator;Semantic - operator - overloaded;Semantic - (TRANSIENT)"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;DashboardExistsForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDashboardForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_config&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - local name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDashboardByRole&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - local name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
 
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;GetDashboardByRole&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - struct name;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;user&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_userManager&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;FindByIdAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;ToString&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;If&amp;nbsp;we&amp;nbsp;can't&amp;nbsp;find&amp;nbsp;the&amp;nbsp;user,&amp;nbsp;load&amp;nbsp;the&amp;nbsp;default&amp;nbsp;dashboard.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - local name;Semantic - (TRANSIENT)"&gt;user&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDashboardAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_config&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;template&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_roleDashboardService&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDashboardTemplateByRoleAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - local name;Semantic - (TRANSIENT)"&gt;user&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;CreateDashboardFromAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - local name;Semantic - (TRANSIENT)"&gt;template&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDashboardForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_config&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;span class="punctuation"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;br /&gt;.&lt;br /&gt;.&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;While our &lt;code&gt;OnGet()&lt;/code&gt; contains a bit more code, our new service makes it easier to use.&lt;/p&gt;
&lt;p&gt;If we have a user id and a dashboard exists for a user, assign the dashboard to the Dashboard property. If not, see if we can get a dashboard by a specific role.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;GetDashboardByRole&lt;/code&gt; method takes in a GUID (user.ID) and tries to locate the user. If it can't find it, return a default dashboard through the &lt;code&gt;GetDashboardAsync(_config)&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;If we made it this far, we attempt to get a DefaultDashboard template by role. As mentioned previously, we &lt;strong&gt;&lt;em&gt;ALWAYS&lt;/em&gt;&lt;/strong&gt; return a DefaultDashboard since the next line uses the template to build a new dashboard for the user.&lt;/p&gt;
&lt;p&gt;Finally, we return the users new dashboard.&lt;/p&gt;
&lt;h2&gt;Updating _LoginPartial.cshtml&lt;/h2&gt;
&lt;p&gt;Since we changed the Identity models, we have to update the &lt;code&gt;_LoginPartial.cshtml&lt;/code&gt;&amp;nbsp;as well.&lt;/p&gt;
&lt;p&gt;Change this:&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorDirective;Semantic - (TRANSIENT)"&gt;inject&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;SignInManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name"&gt;IdentityUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;SignInManager&lt;/span&gt;
&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="RazorDirective;Semantic - RazorDirective;Syntactic - (TRANSIENT)"&gt;inject&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;UserManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name"&gt;IdentityUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - local name;Semantic - (TRANSIENT)"&gt;UserManager&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;to this:&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorDirective;Semantic - (TRANSIENT)"&gt;inject&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;SignInManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;SignInManager&lt;/span&gt;
&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="RazorDirective;Semantic - RazorDirective;Syntactic - (TRANSIENT)"&gt;inject&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;UserManager&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name"&gt;TuxboardUser&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="ReSharper Dead Code - local name;Semantic - (TRANSIENT)"&gt;UserManager&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;With everything in place, we can now look at the tables and how to set this up.&lt;/p&gt;
&lt;h2&gt;Configuring the Database&lt;/h2&gt;
&lt;p&gt;As mentioned above, the Tuxboard database was originally meant for software products using the &lt;code&gt;Plan&lt;/code&gt; and &lt;code&gt;WidgetPlan&lt;/code&gt; tables. Example subscription plans would be similar to the following:&lt;/p&gt;
&lt;table class="table table-responsive table-sm table-striped"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PlanID&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody class="table-group-divider"&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Platinum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Gold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Silver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Bronze&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;table class="table table-responsive table-sm table-striped"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PlanID&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody class="table-group-divider"&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Premium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Professional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The product can contain any number of marketing tiers or levels for different experience levels of users.&lt;/p&gt;
&lt;p&gt;When a user signs up, they select a Plan based on their needs. The PlanID is attached to a default dashboard which is set up ahead of time.&lt;/p&gt;
&lt;p&gt;If you've jumped down to here from the top, we need a way to attach these roles to the users.&lt;/p&gt;
&lt;p&gt;The problem with a roles approach is identifying the role of a user when they register. How do we know a user's role when they get to their dashboard? There needs to be a source of truth for the roles (and I leave that to the administrators of the system).&lt;/p&gt;
&lt;p&gt;When a user registers on a website, they can tell you what subscription plan they want which is why the Plan table is a better for consumers.&lt;/p&gt;
&lt;p&gt;For right now, we'll proceed with updating the database by &lt;a href="https://www.danylkoweb.com/Blog/knowing-where-to-hit-OX" title="Go to Knowing Where To Hit"&gt;showing you where to hit&lt;/a&gt; to make this work as expected.&lt;/p&gt;
&lt;h3&gt;Creating the Records&lt;/h3&gt;
&lt;p&gt;For this process, we need to create two users with passwords.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16" title="Go to SQL Server Management Studio on learn.microsoft.com"&gt;SQL Server Management Studio&lt;/a&gt; (SSMS) and locate the &lt;em&gt;10-Default-Dashboards&lt;/em&gt; database. The database should already be created based on the "update-database" command performed at the beginning of the post.&lt;/li&gt;
&lt;li&gt;Open a new Query Window&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;SELECT * FROM TuxboardRole&lt;/code&gt; There should be two records: Basic and Admin. Remember these two IDs for our UserRole table below.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;SELECT * FROM RoleDefaultDashboards&lt;/code&gt; There should also be two records in there: one for Basic and one for Admin.&lt;/li&gt;
&lt;li&gt;In Visual Studio, run the application and create two users.&lt;/li&gt;
&lt;li&gt;In SSMS, type &lt;code&gt;SELECT * FROM TuxboardUser&lt;/code&gt; to show the two users.&lt;/li&gt;
&lt;li&gt;To relate each user to a basic role, type the following and press F5 to execute it:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;INSERT INTO TuxboardUserRole&lt;/code&gt;&lt;br /&gt;&lt;code&gt;SELECT&lt;br /&gt;  '&amp;lt;userid-from-tuxboarduser&amp;gt;' as UserId,&lt;br /&gt;  '31C3DF95-FDC6-4FB5-82AB-0436EA93C1B1' as RoleId -- Basic Role&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;For admin users, type in the following and press F5 to execute:&lt;br /&gt;&lt;code&gt;INSERT INTO TuxboardUserRole&lt;/code&gt;&lt;br /&gt;&lt;code&gt;SELECT&lt;br /&gt;&amp;nbsp; '&amp;lt;userid-from-tuxboarduser&amp;gt;' as UserId,&lt;br /&gt;&amp;nbsp; '7E69EB1F-07C0-46A1-B4E8-86F56386C250' as RoleId -- Admin Role&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When you run the application and an administrator logs in, they'll be presented with an Administrative dashboard and a widget in the first column. When a regular user logs in, they'll see a standard dashboard with a widget in the right column.&lt;/p&gt;
&lt;p&gt;Again, when a user logs in, they require a role to receive a dashboard. If they don't have a role assigned to them, they'll receive the default dashboard.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this post, we assigned roles to default dashboards allowing users who login can see their own dashboard with custom widgets specific to their role.&lt;/p&gt;
&lt;p&gt;We'll look at a better way to create these default dashboards in a future post.&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Creating Default Dashboards using Roles&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB" title="Go to Creating Custom Tuxboard Widgets"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;&lt;ul class="list-inline link-list"&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://www.linkedin.com/in/jonathandanylko" title="LinkedIn Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/linkedin_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://twitter.com/jdanylko" title="Twitter Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/twitter_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://instagram.com/jdanylko" title="Instagram Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/instagram-16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jonathan "JD" Danylko is an author, web architect, and entrepreneur who's been programming for over 30 years. He's developed websites for small, medium, and Fortune 500 companies since 1996.&lt;/p&gt;
&lt;p&gt;He currently works at &lt;a href="https://www.danylkoweb.com/Blog/growing-up-with-insight-O4" title="Go to Growing up with Insight"&gt;Insight Enterprises&lt;/a&gt; as an Architect.&lt;/p&gt;
&lt;p&gt;When asked what he likes to do in his spare time, he replies, "I like to write and I like to code. I also like to write about code."&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Sun, 18 Aug 2024 00:00:00 -0700</pubDate></item><item><guid isPermaLink="false">8bc176ea-a1aa-4934-ba65-af9775684ad7</guid><link>https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7</link><title>Creating User-Specific Dashboards</title><description>&lt;p&gt;By Jonathan "JD" Danylko&lt;/p&gt;&lt;p&gt;&lt;strong&gt;As a final post for this entire series, we'll look at creating dashboards for individual users&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-users.jpg" title="Creating user-specific dashboards" alt="Collection of people using their smartphones" class="img-fluid no-float" width="640" height="426" /&gt;&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Creating User-Specific Dashboards&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB" title="Go to Creating Custom Tuxboard Widgets"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In the last post, we demonstrated how to use the widget toolbar with capabilities to remove and minimize a widget.&lt;/p&gt;
&lt;p&gt;While all of the features we covered in past examples are great, it's only a single dashboard allowing multiple people to add and remove widgets. In real-life, &lt;strong&gt;there would be no reason&lt;/strong&gt; to even create a dashboard like this because multiple users could manipulate that one dashboard causing absolute chaos with "&lt;a href="https://www.youtube.com/watch?v=-sED4fzIV0k" title="Go to Ghostbusters Clip on youtube.com"&gt;cats and dogs living together...mass hysteria!&lt;/a&gt;"&lt;/p&gt;
&lt;p&gt;The purpose for building these simple dashboards was to provide examples so fellow developers could see it in action locally.&lt;/p&gt;
&lt;p&gt;In today's post, we'll build on what we previously created and give users their own personal dashboard when they log on.&lt;/p&gt;
&lt;p&gt;With everything we've done so far, it wouldn't be efficient to type everything in again. The good news is everything is already built for us and we can easily transition our dashboard to a user-based dashboard project.&lt;/p&gt;
&lt;p&gt;Let's get started.&lt;/p&gt;
&lt;h2&gt;Creating the Project&lt;/h2&gt;
&lt;p&gt;To start, we need to create an ASP.NET Core Web App (Razor Page) by clicking &lt;em&gt;&lt;code&gt;New &amp;gt; Project&lt;/code&gt;&lt;/em&gt; in Visual Studio.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-new-project-razor.png" title="Create Project in Visual Studio 2022" alt="Screenshot of Create Project in Visual Studio 2022" class="img-fluid no-float" width="640" height="426" /&gt;&lt;/p&gt;
&lt;p&gt;After clicking Next, enter the specifics of the project.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-new-project-configure.png" title="Configure Project in Visual Studio 2022" alt="Screenshot of Configure Project in Visual Studio 2022" class="img-fluid no-float" width="640" height="449" /&gt;&lt;/p&gt;
&lt;p&gt;For this example, we'll select the "Individual Accounts" option for the AuthenticationType on the "Additional Information" screen.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-new-project-additional-info.png" title="Additional Information Screen for Project in Visual Studio 2022" alt="Screenshot of Additional Information for Project in Visual Studio 2022" class="img-fluid no-float" width="640" height="449" /&gt;&lt;/p&gt;
&lt;p&gt;Click Create.&lt;/p&gt;
&lt;p&gt;The boilerplate gives us a project template which uses MS Identity for logging individuals into the system. &lt;em&gt;&lt;strong&gt;The whole reason to use MS Identity is to associate an ID with a user&lt;/strong&gt;&lt;/em&gt;. We could even replace MS Identity with another authentication/authorization library like Azure Entra authentication. The User ID for Tuxboard is a GUID.&lt;/p&gt;
&lt;p&gt;If we look at the project, we can see the folder structure contains the Identity &lt;code&gt;Data\Migrations&lt;/code&gt; folder with an &lt;code&gt;ApplicationDbContext&lt;/code&gt;. Pretty standard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next&lt;/strong&gt;, change the appsettings.json to point to a localhost instance of SQL Server as shown below. Replace "&lt;code&gt;&amp;lt;DatabaseNameHere&amp;gt;&lt;/code&gt;" with your database name.&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="operator - operator;Syntactic - (TRANSIENT)"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&lt;span class="JSON Property Name - type;Syntactic - (TRANSIENT)"&gt;"ConnectionStrings"&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="operator;Syntactic - operator - (TRANSIENT)"&gt;{&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="JSON Property Name - type;Syntactic - (TRANSIENT)"&gt;"DefaultConnection"&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string;Syntactic - string - (TRANSIENT)"&gt;"Data Source=localhost;Initial Catalog=&amp;lt;DatabaseNameHere&amp;gt;;Integrated Security=True;MultipleActiveResultSets=True;TrustServerCertificate=True"&lt;/span&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&lt;span class="operator;Syntactic - operator - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&lt;span class="JSON Property Name - type;Syntactic - (TRANSIENT)"&gt;"Logging"&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="operator;Syntactic - operator - (TRANSIENT)"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="JSON Property Name - type;Syntactic - (TRANSIENT)"&gt;"LogLevel"&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="operator - operator;Syntactic - (TRANSIENT)"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="JSON Property Name - type;Syntactic - (TRANSIENT)"&gt;"Default"&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string - string;Syntactic - (TRANSIENT)"&gt;"Information"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="JSON Property Name - type;Syntactic - (TRANSIENT)"&gt;"Microsoft.AspNetCore"&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string;Syntactic - string - (TRANSIENT)"&gt;"Warning"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator;Syntactic - operator - (TRANSIENT)"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&lt;span class="operator - operator;Syntactic - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&lt;span class="JSON Property Name - type;Syntactic - (TRANSIENT)"&gt;"AllowedHosts"&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string;Syntactic - string - (TRANSIENT)"&gt;"*"&lt;/span&gt;
&lt;span class="operator - operator;Syntactic - (TRANSIENT)"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Once we have the appsettings.json updated, we can update the database through the Package Manager Console (&lt;em&gt;&lt;code&gt;View &amp;gt; Other Windows... &amp;gt; Package Manager Console&lt;/code&gt;&lt;/em&gt;).&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="formal language"&gt;Update-Database&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;-Context&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;ApplicationDbContext&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;After hitting enter, our Identity tables should exist in SQL Server.&lt;/p&gt;
&lt;h2&gt;Adding Tuxboard&lt;/h2&gt;
&lt;p&gt;Once we have our Identity tables in place, we can add Tuxboard through NuGet to create those tables.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Add Tuxboard to the project&lt;/strong&gt; through NuGet (&lt;em&gt;&lt;code&gt;Tools &amp;gt; NuGet Package Manager &amp;gt; Manage NuGet Packages for Solution...&lt;/code&gt;&lt;/em&gt;). The package is called &lt;code&gt;Tuxboard.Core&lt;/code&gt; and the version as of now is 1.6.5.&lt;/p&gt;
&lt;p&gt;Once Tuxboard is included, we need to add a migration and update the database, but first, we need to update our &lt;code&gt;appsettings.json&lt;/code&gt; to include Tuxboard settings. Add the following to the &lt;code&gt;appsettings.json&lt;/code&gt; file.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="JSON Property Name - type;Syntactic - (TRANSIENT)"&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;strong&gt;"TuxboardConfig"&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="operator - operator;Syntactic - (TRANSIENT)"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&lt;span class="JSON Property Name - type;Syntactic - (TRANSIENT)"&gt;"ConnectionString"&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string;Syntactic - string - (TRANSIENT)"&gt;"Data Source=localhost;Initial Catalog=&amp;lt;DatabaseNameHere&amp;gt;;Integrated Security=True;MultipleActiveResultSets=True;TrustServerCertificate=True"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&lt;span class="JSON Property Name - type;Syntactic - (TRANSIENT)"&gt;"Schema"&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string - string;Syntactic - (TRANSIENT)"&gt;"dbo"&lt;/span&gt;
&lt;span class="operator;Syntactic - operator - (TRANSIENT)"&gt;}&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;
&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;After updating the settings, now we can add the migration and update the database.&amp;nbsp;To add the migrations, type the following into the Package Manager Console.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="formal language"&gt;add-migration&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;Initial&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;-Context&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;TuxDbContext&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;-OutputDir&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;Data\Migrations\TuxboardContext&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The migrations for Tuxboard were placed in it's own directory below the &lt;code&gt;Data\Migrations&lt;/code&gt; folder using the &lt;code&gt;-OutputDir&lt;/code&gt; parameter.&lt;/p&gt;
&lt;p&gt;Once the migration finishes, we can update the database.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="formal language"&gt;Update-Database&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;-Context&lt;/span&gt;&amp;nbsp;&lt;span class="formal language"&gt;TuxDbContext&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;If the connection string in the &lt;code&gt;appsettings.json&lt;/code&gt; is the same as the DefaultConnection, the tables will be added to the database. Based on the &lt;code&gt;appsettings.json&lt;/code&gt;, the &lt;code&gt;update-database&lt;/code&gt; command will use the TuxboardConfig:ConnectionString to create the schema.&lt;/p&gt;
&lt;p&gt;After the tables are created, we can move on to the transitioning code over to the project.&lt;/p&gt;
&lt;h2&gt;Creating the Dashboard (or not)&lt;/h2&gt;
&lt;p&gt;At this point, we have two options: we can create a dashboard from scratch or reuse one of our previous examples and copy the code over.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If building a dashboard from scratch&lt;/strong&gt;, begin building your dashboard adding the features you want and jump down to the next section for code changes for users.&lt;/p&gt;
&lt;p&gt;This section will explain all of the moving pieces to copy from one project to another to confirm the dashboard works as expected.&lt;/p&gt;
&lt;p&gt;For this project, we'll use the same files from the &lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or deleting widgets)"&gt;08-Widget-Toolbar&lt;/a&gt; project since it's a culmination of everything we've worked on so far.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Copy the following files/folders over:
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;wwwroot/scss&lt;/code&gt; (CSS folder)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wwwroot/src&lt;/code&gt; (TS/JS folder)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wwwroot/tsconfig.json&lt;/code&gt; (file)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/Dto&lt;/code&gt; (C# folder)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/Extensions&lt;/code&gt; (C# folder)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/Helpers&lt;/code&gt; (C# folder)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/Models&lt;/code&gt; (C# folder)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/Pages/Shared/Components&lt;/code&gt; (C# folder)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Copy &lt;code&gt;/gulpfile.js&lt;/code&gt; and &lt;code&gt;/package.json&lt;/code&gt; to the root of your project
&lt;ol&gt;
&lt;li&gt;Right-click on the &lt;code&gt;package.json&lt;/code&gt; file and &lt;code&gt;Restore Packages&lt;/code&gt; to make sure the &lt;code&gt;gulpfile.js&lt;/code&gt; will run during the build process.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;For all of the C# folders above, change to the project's namespace instead of &lt;code&gt;08-Widget-Toolbar&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;code&gt;Pages/_viewImports.cshtml&lt;/code&gt;, confirm TagHelpers are registered based on your project name.&lt;br /&gt;&lt;br /&gt;
&lt;pre&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="RazorDirective;Semantic - RazorDirective;Syntactic - (TRANSIENT)"&gt;addTagHelper&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;*, &amp;lt;your-project-name-here&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;In the &lt;code&gt;Program.cs&lt;/code&gt;, add your tuxboard configuration and DbContext&lt;br /&gt;&lt;br /&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="comment"&gt;//&amp;nbsp;Tuxboard&amp;nbsp;Configuration&lt;/span&gt;
&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;appConfig&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardConfig&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Configuration&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetSection&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - keyword;Semantic - (TRANSIENT)"&gt;nameof&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxboardConfig&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Bind&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;appConfig&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="comment"&gt;&lt;br /&gt;// Tuxboard DbContext&lt;/span&gt;
&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Services&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;AddDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;options&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;options&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;UseSqlServer&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;appConfig&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;ConnectionString&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;x&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;x&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;MigrationsAssembly&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"09-User-Dashboard"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;span class="punctuation"&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Also in the &lt;code&gt;Program.cs&lt;/code&gt;, add the dependency injection as well&lt;br /&gt;&lt;br /&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="comment"&gt;//&amp;nbsp;For&amp;nbsp;Dependency&amp;nbsp;Injection&lt;/span&gt;
&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Services&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;AddTransient&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IDashboardService&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;DashboardService&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;builder&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Services&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;AddTransient&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;ITuxDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;TuxDbContext&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;span class="punctuation"&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Update the &lt;code&gt;Index.cshtml&lt;/code&gt; and &lt;code&gt;Index.cshtml.cs&lt;/code&gt; file with code from the &lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;08-Widget-Toolbar&lt;/a&gt; project.&lt;/li&gt;
&lt;li&gt;Update the &lt;code&gt;_Layout.cshtml&lt;/code&gt; to include Bootstrap and FontAwesome CSS and JavaScript files.&lt;br /&gt;&lt;br /&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;link&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;rel&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;stylesheet&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;href&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;~/lib/bootstrap/css/bootstrap.min.css&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;link&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;rel&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;stylesheet&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;href&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;~/lib/fontawesome/css/all.min.css&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;src&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;~/lib/bootstrap/js/bootstrap.bundle.min.js&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;script&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;script&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;src&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;~/js/dashboard.min.js&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;script&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span class="string"&gt;&lt;br /&gt;&lt;/span&gt;After all of these changes are copied over from the previous project, running the project will present us with the generic dashboard.&lt;/p&gt;
&lt;p&gt;Now that we have a dashboard and MS Identity both in one project, we need to connect the two.&lt;/p&gt;
&lt;ol&gt;&lt;/ol&gt;
&lt;h2&gt;Getting Personal[-ized]&lt;/h2&gt;
&lt;p&gt;The great part about using Identity (or Entra) is the ability to know who a user is when they sign in. To tie everything together, we need a way to identify the user and retrieve their dashboard.&lt;/p&gt;
&lt;p&gt;First, in the &lt;code&gt;Index.cshtml.cs&lt;/code&gt; file, we create the &lt;code&gt;GetIdentity()&lt;/code&gt; method to retrieve the user ID.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;GetIdentity&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;claim&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;User&lt;/span&gt;&lt;span class="ReSharper Dead Code - operator;Semantic - (TRANSIENT)"&gt;?&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;FindFirst&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;ClaimTypes&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="constant name;Semantic - identifier;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;NameIdentifier&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;claim&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;claim&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Value&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;GetIdentity()&lt;/code&gt; method will be used exclusively throughout each each method.&lt;/p&gt;
&lt;p&gt;If a user is logged in, we locate the ID by finding the &lt;code&gt;NameIdentifier&lt;/code&gt; claim and returning it's value.&lt;/p&gt;
&lt;p&gt;If there isn't a logged in user, we simply return an empty Guid.&lt;/p&gt;
&lt;p&gt;With this simple method in place, we can now identify the user and retrieve their personal dashboard.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;OnGet()&lt;/code&gt; method in the &lt;code&gt;Index.cshtml.cs&lt;/code&gt; becomes extremely simple now.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;OnGet&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;id&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetIdentity&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&amp;nbsp;&lt;span class="operator;Semantic - operator - overloaded;Semantic - (TRANSIENT)"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - struct name;Semantic - (TRANSIENT)"&gt;Guid&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDashboardForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_config&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;If we don't know who the user is, don't retrieve a dashboard and dashboard will be null.&lt;/p&gt;
&lt;p&gt;Throughout all of the Index dashboard code, we can now replace:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword;Semantic - keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDashboardAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_config&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;with this.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword;Semantic - keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;id&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetIdentity&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="keyword;Semantic - keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDashboardForAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_config&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Essentially, all we're doing In the &lt;code&gt;Index.cshtml.cs&lt;/code&gt; file is replacing all &lt;code&gt;GetDashboardAsync(_config)&lt;/code&gt; with &lt;code&gt;GetDashboardForAsync(_config, id)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now, for every user who logs in, they'll have their own dashboard.&lt;/p&gt;
&lt;h3&gt;You Get a Dashboard, You Get a Dashboard...&lt;/h3&gt;
&lt;p&gt;Throughout these examples, we make a call to retrieve a dashboard.&lt;/p&gt;
&lt;p&gt;At first, we were using &lt;code&gt;GetDashboardAsync()&lt;/code&gt; and for those who aren't asynchronous yet, there is also a synchronous call called &lt;code&gt;GetDashboard()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now we're switching gears and using &lt;code&gt;GetDashboardForAsync()&lt;/code&gt; (and &lt;code&gt;GetDashboardFor()&lt;/code&gt; for synchronous calls).&lt;/p&gt;
&lt;p&gt;Here's the process when a GetDashboardXxxx() method is called.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;GetDashboardAsync()&lt;/code&gt; or &lt;code&gt;GetDashboard()&lt;/code&gt; is called, these aren't user-specific and it will load a dashboard from the database where the user is null. If there isn't a dashboard in the database at the time, it will create a brand new one with defaults (which we'll get to in a future post).&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;GetDashboardForAsync()&lt;/code&gt; or &lt;code&gt;GetDashboardFor()&lt;/code&gt; is called with a user ID, the same thing will occur: it will create a brand new dashboard if one doesn't exist and assign a user ID to it. If there is an existing dashboard for this user, it'll load it.&lt;/p&gt;
&lt;p&gt;Basically, every &lt;code&gt;GetDashboardXxxx()&lt;/code&gt; call will always return a dashboard.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;With that said, I return you to your regularly scheduled (dashboard) programming...&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Displaying the Dashboard&lt;/h2&gt;
&lt;p&gt;When a user isn't logged in, we shouldn't display a dashboard. Without a dashboard's data, we'll break some of our ViewComponents.&lt;/p&gt;
&lt;p&gt;The two ViewComponents we need to update are the Tuxbar and the Tuxboard Template.&lt;/p&gt;
&lt;p&gt;Remember in our code how the Dashboard property is set to null at the top of our &lt;code&gt;index.cshtml.cs&lt;/code&gt;?&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Let's add another property called &lt;code&gt;HasDashboard&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;bool&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;HasDashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;This provides an easy way to identify whether a user has a dashboard or not. If they are logged in, they should have a dashboard (based on our previous section).&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;Index.cshtml&lt;/code&gt;, we can use this new property to add a heading for users not logged in.&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;h3&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;text-center&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="RazorTagHelperAttribute"&gt;condition&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;HasDashboard&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;Register&amp;nbsp;or&amp;nbsp;login&amp;nbsp;to&amp;nbsp;view&amp;nbsp;your&amp;nbsp;dashboard.&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;h3&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt; 
&lt;/pre&gt;
&lt;p&gt;But what about our ViewComponents? What if there isn't a dashboard model for our Tuxbar or TuxboardTemplate ViewComponent?&lt;/p&gt;
&lt;p&gt;We can't really apply a condition TagHelper inside another TagHelper (a drawback in my eyes), but we can examine the model passed into each ViewComponent. Let's look at the &lt;code&gt;TuxboardTemplateViewComponent&lt;/code&gt; first.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="punctuation"&gt;[&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ViewComponent&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Name&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"tuxboardtemplate"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;
&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxboardTemplateViewComponent&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ViewComponent&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IViewComponentResult&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;Invoke&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;model&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;model&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;Content&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;View&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;model&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Since we pass the Dashboard property into the ViewComponent, we can determine whether a user is logged in or not.&lt;/p&gt;
&lt;p&gt;If they aren't logged in (model is null), no content is returned. If they are, they'll see their dashboard.&lt;/p&gt;
&lt;p&gt;Oh...and they'll see their Tuxbar if they're using one. We'll need to apply the same logic to our Tuxbar ViewComponent so it has the same return result.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="punctuation"&gt;[&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ViewComponent&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Name&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"tuxbar"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;
&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;TuxbarViewComponent&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ViewComponent&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IViewComponentResult&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;Invoke&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;model&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;model&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;Content&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;View&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;model&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The empty content is also a way to visually show if something is wrong if a dashboard model isn't passed into the ViewComponent.&lt;/p&gt;
&lt;h2&gt;The Final Result&lt;/h2&gt;
&lt;p&gt;With everything in place, we can now register users and each user can have their own dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-user-dashboard.gif" title="Loading a user dashboard on login" alt="Screenshot of Loading a user dashboard on login" class="img-fluid no-float" width="904" height="559" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;All of these core examples in the past have led us up to this moment where users can create their own dashboards. While some of these features/examples are bells and whistles, a majority of these example provide a collection of fundamental stepping stones into how users are empowered to create their own workspaces and examine data in various ways. They want to personalize their dashboard based on how they work.&lt;/p&gt;
&lt;p&gt;Today's post covered how to create those user-specific dashboards giving users the freedom to experiment with their layouts.&lt;/p&gt;
&lt;p&gt;Everything from this point forward will be considered extras, features, and supporting posts to expand and enhance Tuxboard dashboards even further.&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Creating User-Specific Dashboards&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB" title="Go to Creating Custom Tuxboard Widgets"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;&lt;ul class="list-inline link-list"&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://www.linkedin.com/in/jonathandanylko" title="LinkedIn Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/linkedin_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://twitter.com/jdanylko" title="Twitter Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/twitter_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://instagram.com/jdanylko" title="Instagram Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/instagram-16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jonathan "JD" Danylko is an author, web architect, and entrepreneur who's been programming for over 30 years. He's developed websites for small, medium, and Fortune 500 companies since 1996.&lt;/p&gt;
&lt;p&gt;He currently works at &lt;a href="https://www.danylkoweb.com/Blog/growing-up-with-insight-O4" title="Go to Growing up with Insight"&gt;Insight Enterprises&lt;/a&gt; as an Architect.&lt;/p&gt;
&lt;p&gt;When asked what he likes to do in his spare time, he replies, "I like to write and I like to code. I also like to write about code."&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Thu, 18 Jul 2024 00:00:00 -0700</pubDate></item><item><guid isPermaLink="false">37b7f031-11cb-4f91-aeb3-1b5cef589b52</guid><link>https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6</link><title>Using Widget Toolbars (or Deleting Widgets)</title><description>&lt;p&gt;By Jonathan "JD" Danylko&lt;/p&gt;&lt;p&gt;&lt;strong&gt;In today's post, we look at two ways to enhance widgets on your dashboard&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-widget-toolbar-main.jpg" title="A widget is only as good as it's tools" alt="Tools placed specifically on a table in a neat order" class="img-fluid no-float" width="640" height="426" /&gt;&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB" title="Go to Creating Custom Tuxboard Widgets"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In the last &lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding widgets with a Tuxboard Dialog"&gt;post&lt;/a&gt;, we demonstrated how to add widgets to a dashboard with a new Add Widget dialog.&lt;/p&gt;
&lt;p&gt;While adding widgets is considered a fundamental feature of a dashboard, we currently need a way to remove a widget from the dashboard and there's a couple of ways we can do this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add an 'X' to each widget header allowing a user to immediately remove the widget.&lt;/li&gt;
&lt;li&gt;Create an ellipsis to provide a dropdown with multiple options including a remove option.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In this post, we'll cover both ways to remove a widget.&lt;/p&gt;
&lt;h2&gt;What is a Widget Toolbar?&lt;/h2&gt;
&lt;p&gt;A widget toolbar is a collection of buttons in the header of each widget. Each widget can have it's own functions depending on the type of widget.&lt;/p&gt;
&lt;p&gt;For now, we'll focus on placing a button in the widget toolbar to remove a widget from the dashboard.&lt;/p&gt;
&lt;p&gt;While creating dialogs is a bit intimidating, creating widget toolbars is a bit easier. We don't have a lot of moving parts, but it's an easier implementation.&lt;/p&gt;
&lt;h2&gt;Approach 1: Deleting a Widget&lt;/h2&gt;
&lt;p&gt;The first approach is adding a new button in the widget header to delete a widget.&lt;/p&gt;
&lt;p&gt;Let's focus on the HTML first.&lt;/p&gt;
&lt;h3&gt;Adjusting the Widget Template (HTML)&lt;/h3&gt;
&lt;p&gt;Our first task is to update the widget template ViewComponent located in the &lt;code&gt;Pages/Shared/Components/WidgetTemplate&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;Since every widget contains headers, adding buttons to the WidgetTemplate will apply to all widgets.&lt;/p&gt;
&lt;p&gt;If we look at the &lt;code&gt;Default.cshtml&lt;/code&gt; file, our current WidgetTemplate looks like this.&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="HTML Comment;Semantic - HTML Comment;Syntactic - (TRANSIENT)"&gt;&amp;lt;!--&lt;/span&gt;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;&amp;nbsp;Widgets&amp;nbsp;&lt;/span&gt;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;--&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="RazorTagHelperAttribute"&gt;condition&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;UseTemplate&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;card&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt; mb-3&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;data-id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;WidgetPlacementId&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;draggable&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;true&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;card-header&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;d-flex&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;small&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - method name;Semantic - (TRANSIENT)"&gt;GetSettingValueByName&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string;Syntactic - string;Semantic - (TRANSIENT)"&gt;"widgettitle"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;small&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;card-body&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="keyword;Syntactic - keyword;Semantic - (TRANSIENT)"&gt;await&lt;/span&gt;&lt;span class="keyword"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Component&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - method name;Semantic - (TRANSIENT)"&gt;InvokeAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Widget&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Name&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt; 
&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;For our purpose, the &lt;code&gt;div.card-header&lt;/code&gt; is our primary focus.&lt;/p&gt;
&lt;p&gt;Using &lt;a href="https://fontawesome.com/" title="Go to FontAwesome.com"&gt;FontAwesome&lt;/a&gt; again, we'll use the xmark icon inside the button and use flexbox for our layout.&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;.&lt;br /&gt;.&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;card-header&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;d-flex&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;small&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Semantic - method name;Syntactic - (TRANSIENT)"&gt;GetSettingValueByName&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string;Syntactic - string;Semantic - (TRANSIENT)"&gt;"widgettitle"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;small&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;widget-toolbar&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;d-flex&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;ms-auto&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-sm&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;remove-widget&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;p-0&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fa-solid&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-xmark&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;.&lt;/pre&gt;
&lt;p&gt;Our widget toolbar now contains a delete button.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-delete-widget.png" title="A Widget Toolbar containing a delete button" alt="Screenshot of widget with a delete button" class="img-fluid no-float" width="573" height="470" /&gt;&lt;/p&gt;
&lt;h3&gt;Attaching a Delete Event (TS/JS)&lt;/h3&gt;
&lt;p&gt;The delete event is easy enough to implement and will reside in the &lt;code&gt;tuxboard.ts&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wwwroot/src/tuxboard/tuxboard.ts&lt;/code&gt;&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;attachWidgetToolbarEvents&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;dashboard&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelectorAll&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetRemoveWidgetSelector&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;forEach&lt;/span&gt;&lt;span class="punctuation"&gt;((&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="UnnecessaryCodeDiagnostic - identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;index&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;number&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'click'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;Event&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;removeWidget&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="punctuation"&gt;))&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;&lt;br /&gt;removeWidget&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;Event&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;preventDefault&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;target&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;target&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;HTMLElement&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt; getC&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;losestByClass&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;target&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;noPeriod&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetSelector&lt;/span&gt;&lt;span class="punctuation"&gt;))&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;HTMLDivElement&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetId&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;getAttribute&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;dataIdAttribute&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;service&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;removeWidget&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetId&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;then&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;response&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;response&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;ok&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;remove&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;response&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Our new &lt;code&gt;attachWidgetToolbarEvents()&lt;/code&gt; method looks for the &lt;code&gt;.remove-widget&lt;/code&gt; class and attaches a click event pointing to the &lt;code&gt;removeWidget()&lt;/code&gt; method. The &lt;code&gt;attachWidgetToolbarEvents()&lt;/code&gt; method is necessary in the &lt;code&gt;initialize()&lt;/code&gt; method and the &lt;code&gt;updateDashboard()&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;getClosestByClass&lt;/code&gt; and &lt;code&gt;noPeriod&lt;/code&gt; JavaScript functions are necessary to identify what widget we're in by examining the parent's class (CSS, not C#). These two functions are located in the &lt;code&gt;common.ts&lt;/code&gt; file.&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="keyword - control"&gt;export&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;noPeriod&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;startsWith&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"."&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;replace&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"."&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;""&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;id&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="keyword - control"&gt;&lt;br /&gt;export&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt; getC&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;losestByClass&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;element&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;HTMLElement&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;classToSearch&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;while&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;element&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;element&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;classList&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;contains&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;classToSearch&lt;/span&gt;&lt;span class="punctuation"&gt;))&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;element&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;element&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;element&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;parentElement&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;removeWidget()&lt;/code&gt; method walks up the DOM tree by looking for a div element with a class of the defaultWidgetSelector (which is &lt;code&gt;.card&lt;/code&gt;) and returns the widget id. We call our service method (removeWidget) and receive a response back. If the response we receive is ok, we remove the widget...but only if it's been Ok'd by the server.&lt;/p&gt;
&lt;h3&gt;Updating the Tuxboard Service (TS/JS)&lt;/h3&gt;
&lt;p&gt;Next, we implement the &lt;code&gt;removeWidget()&lt;/code&gt; method in our &lt;code&gt;tuxboardService.ts&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;tuxRemoveWidgetUrl&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"?handler=RemoveWidget"&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="keyword"&gt;.&lt;br /&gt;.&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;removeWidget&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;widgetId&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;span class="type"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;postData&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;WidgetId&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;widgetId&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;};&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - type;Semantic - (TRANSIENT)"&gt;Request&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;tuxRemoveWidgetUrl&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;method&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"post"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;body&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - text;Semantic - (TRANSIENT)"&gt;JSON&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;stringify&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;postData&lt;/span&gt;&lt;span class="punctuation"&gt;),&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;headers&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;'Content-Type'&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;'application/json'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;'RequestVerificationToken'&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getToken&lt;/span&gt;&lt;span class="punctuation"&gt;(),&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;fetch&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Our service receives a widget id and prepares the request to send to the server. Once everything is created, we make the API call and perform a single fetch.&lt;/p&gt;
&lt;p&gt;The fetch doesn't have our additional pipeline of methods because we only want to know whether the server returns an Ok (200) or a NotFound (404). If it is Ok, then we can remove the widget.&lt;/p&gt;
&lt;h3&gt;Removing the Widget (C#)&lt;/h3&gt;
&lt;p&gt;In the &lt;code&gt;Index.cshtml.cs&lt;/code&gt; C# file, our TypeScript/JavaScript method calls the &lt;code&gt;OnPostRemoveWidgetAsync()&lt;/code&gt; method and performs the delete.&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IActionResult&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;OnPostRemoveWidgetAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;[&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;FromBody&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;RemoveWidgetRequest&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;request&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDashboardAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_config&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="comment"&gt;// Use this as a way to identify a widget placement IN A DASHBOARD.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;placement&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;dashboard&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetCurrentTab&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetWidgetPlacements&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;e&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;WidgetPlacementId&lt;/span&gt;&amp;nbsp;&lt;span class="operator;Semantic - operator - overloaded;Semantic - (TRANSIENT)"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;WidgetId&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;placement&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;NotFoundResult&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;RemoveWidgetAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;placement&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;WidgetPlacementId&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;OkResult&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;RemoveWidgetAsync()&lt;/code&gt; method near the bottom takes in a WidgetPlacementId which is a Guid.&lt;/p&gt;
&lt;p&gt;Why do we need to get the dashboard at the beginning? Why not simply call the &lt;code&gt;RemoveWidgetAsync()&lt;/code&gt; method and be done with it?&lt;/p&gt;
&lt;p&gt;When receiving a WidgetPlacementId from a JavaScript call, we need to validate it's a widget on the specific dashboard. This provides a security safeguard as opposed to someone simply passing in a random WidgetPlacementId and immediately delete it. While we aren't retrieving user-specific dashboards (yet!), this technique will benefit us in the long run in regards to security.&lt;/p&gt;
&lt;p&gt;With everything in place, we can now remove widgets at any time.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-widget-toolbar-delete.gif" title="Animation: Removing a widget from a dashboard" alt="Animation of removing a widget from a dashboard" class="img-fluid no-float" width="635" height="485" /&gt;&lt;/p&gt;
&lt;p&gt;The downside to this approach is the immediate deletion of a widget &lt;em&gt;without&lt;/em&gt; confirmation. We'll get to that in a bit.&lt;/p&gt;
&lt;h2&gt;Approach 2: Widget Options&lt;/h2&gt;
&lt;p&gt;The second approach places an ellipsis on a button which provides a dropdown list of items.&lt;/p&gt;
&lt;p&gt;There are two reasons to create a widget header dropdown button:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;While I can immediately think of three buttons to place on a widget's toolbar, a dropdown gives a widget header some breathing room. We don't want to crowd the widget's header with too many buttons.&lt;/li&gt;
&lt;li&gt;With approach 1, the user only needs to click the 'X' once with no confirmation and the widget is gone. Even though it's one click, widgets don't contain any settings (yet!) and we can re-add a deleted widget. With a dropdown menu, it gives a user two chances, or two clicks, to confirm whether they wish to delete a widget or not.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In addition to creating the widget options dropdown, we can reuse a majority of the code and simply add a dropdown control to the widget's header.&lt;/p&gt;
&lt;h3&gt;Adding the Dropdown (HTML)&lt;/h3&gt;
&lt;p&gt;The good news is there is a minimal amount of work to add the dropdown button.&lt;/p&gt;
&lt;p&gt;In the WidgetTemplate's &lt;code&gt;Default.cshtml&lt;/code&gt; file, we'll comment out our first approach and add the HTML for the second approach.&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="HTML Comment;Semantic - HTML Comment;Syntactic - (TRANSIENT)"&gt;&amp;lt;!--&lt;/span&gt;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;&amp;nbsp;Widgets&amp;nbsp;&lt;/span&gt;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;--&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="RazorTagHelperAttribute"&gt;condition&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;UseTemplate&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;card&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;mb-3&lt;/span&gt;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="RazorTransition"&gt;(&lt;/span&gt;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Collapsed&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"&amp;nbsp;collapsed"&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="field name;Semantic - static symbol;Semantic - (TRANSIENT)"&gt;Empty&lt;/span&gt;&lt;span class="RazorTransition"&gt;)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;data-id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;WidgetPlacementId&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;draggable&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;true&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;card-header&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;d-flex&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;small&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - method name;Semantic - (TRANSIENT)"&gt;GetSettingValueByName&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string;Syntactic - string;Semantic - (TRANSIENT)"&gt;"widgettitle"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;small&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;widget-toolbar&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;d-flex&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;ms-auto&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Semantic - RazorDirective;Syntactic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorDirective;Semantic - (TRANSIENT)"&gt;*&lt;/span&gt;&lt;span class="comment"&gt;
&lt;/span&gt;&lt;span class="HTML Comment;Semantic - comment;Syntactic - (TRANSIENT)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&amp;nbsp;Approach&amp;nbsp;1&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;
&lt;/span&gt;&lt;span class="HTML Comment;Semantic - comment;Syntactic - (TRANSIENT)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;type="button"&amp;nbsp;class="btn&amp;nbsp;btn-sm&amp;nbsp;remove-widget&amp;nbsp;p-0"&amp;nbsp;title="Remove&amp;nbsp;Widget"&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;
&lt;/span&gt;&lt;span class="HTML Comment;Semantic - comment;Syntactic - (TRANSIENT)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;i&amp;nbsp;class="fa-solid&amp;nbsp;fa-xmark"&amp;gt;&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;
&lt;/span&gt;&lt;span class="HTML Comment;Semantic - comment;Syntactic - (TRANSIENT)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/button&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;
&lt;/span&gt;&lt;span class="HTML Comment;Semantic - comment;Syntactic - (TRANSIENT)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorDirective;Semantic - (TRANSIENT)"&gt;*&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorDirective;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;&amp;lt;!--&lt;/span&gt;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;&amp;nbsp;Approach&amp;nbsp;2&amp;nbsp;&lt;/span&gt;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;--&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;dropdown&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-sm&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;px-1&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;p-0&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;dropdown-toggle&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;role&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;data-bs-toggle&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;dropdown&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;aria-expanded&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;false&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;title&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;Widget&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;Options&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fa-solid&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-ellipsis&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;ul&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;dropdown-menu&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;dropdown-menu-end&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;li&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;dropdown-item&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;remove-widget&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-sm&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;small&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;Remove&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;small&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;li&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;ul&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &amp;nbsp;&amp;nbsp; &lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;card-body&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="keyword;Syntactic - keyword;Semantic - (TRANSIENT)"&gt;await&lt;/span&gt;&lt;span class="keyword"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Component&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - method name;Semantic - (TRANSIENT)"&gt;InvokeAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Widget&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Name&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;There are a couple of things to notice in the &lt;code&gt;div.dropdown-menu&lt;/code&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We're using FontAwesome again with an ellipsis to identify it's a menu.&lt;/li&gt;
&lt;li&gt;Instead of links (&amp;lt;a href=""&amp;gt;), buttons are used for selecting the menu items. For some transparent foreshadowing, Approach 1 used a button to delete a widget.&lt;/li&gt;
&lt;li&gt;The 'X' button used a class called '&lt;code&gt;.remove-widget&lt;/code&gt;'.&amp;nbsp; To achieve the same effect as Approach 1, the same class can be applied to the 'Remove' button.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The only thing left is to add the events for the dropdown toggle through TypeScript/JavaScript.&lt;/p&gt;
&lt;h3&gt;Manually Triggering the Dropdown (TS/JS)&lt;/h3&gt;
&lt;p&gt;The last place to visit is the &lt;code&gt;tuxboard.ts&lt;/code&gt; file to update the &lt;code&gt;attachWidgetToolbarEvents()&lt;/code&gt; (changes in &lt;strong&gt;bold&lt;/strong&gt;).&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="comment"&gt;/*&amp;nbsp;Widget&amp;nbsp;Toolbar&amp;nbsp;Events&amp;nbsp;*/&lt;/span&gt;
&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;&lt;br /&gt;attachWidgetToolbarEvents&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;dashboard&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelectorAll&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetRemoveWidgetSelector&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;forEach&lt;/span&gt;&lt;span class="punctuation"&gt;((&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'click'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;Event&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;removeWidget&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="punctuation"&gt;))&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;span class="punctuation"&gt;&lt;br /&gt;&lt;strong&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span class="comment"&gt;//&amp;nbsp;Grab&amp;nbsp;all&amp;nbsp;dropdown-toggles&amp;nbsp;from&amp;nbsp;inside&amp;nbsp;a&amp;nbsp;widget's&amp;nbsp;header&amp;nbsp;and&amp;nbsp;build&amp;nbsp;them.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;document&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelectorAll&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultDropdownInWidgetHeaderSelector&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;forEach&lt;/span&gt;&lt;span class="punctuation"&gt;((&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'click'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;bootstrap&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - type;Semantic - (TRANSIENT)"&gt;Dropdown&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - static symbol;Semantic - text;Semantic - (TRANSIENT)"&gt;getOrCreateInstance&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;).&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;toggle&lt;/span&gt;&lt;span class="punctuation"&gt;());&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;/strong&gt;&lt;span class="punctuation"&gt;}&lt;/span&gt; 
&lt;/pre&gt;
&lt;p&gt;Funny as it sounds, the &lt;code&gt;defaultWidgetRemoveWidgetSelector&lt;/code&gt; assignment of the click event stays the same. Remember, we applied the class to the button of the dropdown menu item. So the functionality of clicking the menu item will perform as expected as before.&lt;/p&gt;
&lt;p&gt;The list of dropdown selectors exist in the &lt;code&gt;common.ts&lt;/code&gt; file. The &lt;code&gt;defaultDropdownInWidgetHeaderSelector&lt;/code&gt; defines itself as &lt;code&gt;`${defaultWidgetHeaderSelector} ${defaultWidgetDropdownSelector}`&lt;/code&gt; which translates to &lt;code&gt;'.card-header .dropdown-toggle'&lt;/code&gt;. We only want to focus on the dropdowns inside a card header as opposed to other dropdowns on the page if they exist.&lt;/p&gt;
&lt;p&gt;Click events are assigned and, when clicked, performs a static method called &lt;code&gt;getOrCreateInstance()&lt;/code&gt; and immediately issues a &lt;code&gt;toggle()&lt;/code&gt;&amp;nbsp;triggering the dropdown.&lt;/p&gt;
&lt;p&gt;Once compiled, we can see the remove widget in action.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-widget-options-dropdown.gif" title="Animation: Removing a widget using a dropdown menu" alt="Animation of removing a widget using a dropdown menu" class="img-fluid no-float" width="635" height="485" /&gt;&lt;/p&gt;
&lt;p&gt;Since now we know how to add buttons to the widget toolbar, let's add one more.&lt;/p&gt;
&lt;h2&gt;Bonus: Minimize/Restore&lt;/h2&gt;
&lt;p&gt;The purpose of a minimize/restore button is to shrink or enlarge a widget to save space on a dashboard. We can place the button right before the ellipsis as a toggle between the two states.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;However, we do need to save the state of each widget which requires another service. In turn, the widget template requires further modifications.&lt;/p&gt;
&lt;h3&gt;Adding the Buttons (HTML)&lt;/h3&gt;
&lt;p&gt;For our minimize/restore buttons to work, we need to add a button for the initial rendering of the widget (changes in &lt;strong&gt;bold&lt;/strong&gt;).&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="HTML Comment;Semantic - HTML Comment;Syntactic - (TRANSIENT)"&gt;&amp;lt;!--&lt;/span&gt;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;&amp;nbsp;Widgets&amp;nbsp;&lt;/span&gt;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;--&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="RazorTagHelperAttribute"&gt;condition&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;UseTemplate&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;card&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;mb-3&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;data-id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;WidgetPlacementId&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;draggable&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;true&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;card-header&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;d-flex&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;small&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - method name;Semantic - (TRANSIENT)"&gt;GetSettingValueByName&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string;Syntactic - string;Semantic - (TRANSIENT)"&gt;"widgettitle"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;small&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;widget-toolbar&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;d-flex&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;ms-auto&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="RazorTagHelperAttribute"&gt;condition&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Collapsed&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-sm&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt; widget-state&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;p-0&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;title&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;Minimize&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;Widget&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fa-solid&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-window-minimize&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="RazorTagHelperAttribute"&gt;condition&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Collapsed&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-sm&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt; widget-state&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;p-0&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;title&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;Restore&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;Widget&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fa-regular&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-window-maximize&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Semantic - RazorDirective;Syntactic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorDirective;Semantic - (TRANSIENT)"&gt;*&lt;/span&gt;&lt;span class="comment"&gt;
&lt;/span&gt;&lt;span class="HTML Comment;Semantic - comment;Syntactic - (TRANSIENT)"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- Approach 1 --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="comment"&gt;.&lt;br /&gt;.&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Pay attention to the &lt;code&gt;condition&lt;/code&gt; attribute on both buttons.&lt;/p&gt;
&lt;p&gt;Each widget has a &lt;code&gt;Collapsed&lt;/code&gt; boolean property where true means it's minimized and false is restored.&lt;/p&gt;
&lt;p&gt;The collapsed property allows us to present the proper widget setting on initial rendering. Once the buttons are rendered, we need to add our events to change and save the state of each widget.&lt;/p&gt;
&lt;h3&gt;Saving a Widget's State (C#)&lt;/h3&gt;
&lt;p&gt;When saving the widget's state, we can create a quick method called &lt;code&gt;OnPostSetWidgetStateAsync()&lt;/code&gt; to save our collapsed state.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Pages/Index.cshtml.cs&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - interface name;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IActionResult&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;OnPostSetWidgetStateAsync&lt;/span&gt;&lt;span class="punctuation"&gt;([&lt;/span&gt;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;FromBody&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;WidgetStateRequest&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;request&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;widget&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - method name;Semantic - (TRANSIENT)"&gt;UpdateCollapsedAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - property name;Semantic - (TRANSIENT)"&gt;WidgetPlacementId&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - property name;Semantic - (TRANSIENT)"&gt;Collapsed&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - local name;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;OkResult&lt;/span&gt;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;NotFoundResult&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;If it was successfully saved, we return an Ok (200). If not, return a NotFound (404).&lt;/p&gt;
&lt;h3&gt;Adding the Service (TS/JS)&lt;/h3&gt;
&lt;p&gt;Our method call in the &lt;code&gt;tuxboardservice.ts&lt;/code&gt; file is nothing out of the ordinary and calls our new SetWidgetState post.&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;tuxSetWidgetStateUrl&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"?handler=SetWidgetState"&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="keyword"&gt;.&lt;br /&gt;.&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;setWidgetState&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;widgetPlacementId&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;collapsed&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;postData&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;WidgetPlacementId&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;widgetPlacementId&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;Collapsed&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;collapsed&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;};&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - type;Semantic - (TRANSIENT)"&gt;Request&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;tuxSetWidgetStateUrl&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;method&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"post"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;body&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - text;Semantic - (TRANSIENT)"&gt;JSON&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;stringify&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;postData&lt;/span&gt;&lt;span class="punctuation"&gt;),&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;headers&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;'Content-Type'&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;'application/json'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;'RequestVerificationToken'&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getToken&lt;/span&gt;&lt;span class="punctuation"&gt;(),&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;fetch&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Our &lt;code&gt;setWidgetState&lt;/code&gt; method uses the same concept as our delete widget from above. If we receive an Ok (200), we proceed to minimize or restore the widget.&lt;/p&gt;
&lt;p&gt;With that said, let's look at the implementation of minimizing/restoring a widget in the &lt;code&gt;tuxboard.ts&lt;/code&gt; file.&lt;/p&gt;
&lt;h3&gt;Implementing Minimize/Restore (TS/JS)&lt;/h3&gt;
&lt;p&gt;In &lt;code&gt;tuxboard.ts&lt;/code&gt;, we need to attach our events to the widget state (&lt;code&gt;defaultWidgetStateSelector&lt;/code&gt;) in our &lt;code&gt;attachWidgetToolbarEvents()&lt;/code&gt;&amp;nbsp;(changes in &lt;strong&gt;bold&lt;/strong&gt;).&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="comment"&gt;/*&amp;nbsp;Widget&amp;nbsp;Toolbar&amp;nbsp;Events&amp;nbsp;*/&lt;/span&gt;
&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;&lt;br /&gt;attachWidgetToolbarEvents&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;dashboard&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelectorAll&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetRemoveWidgetSelector&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;forEach&lt;/span&gt;&lt;span class="punctuation"&gt;((&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'click'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;Event&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;removeWidget&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="punctuation"&gt;))&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;span class="comment"&gt;&lt;br /&gt;    // Grab all dropdown-toggles from inside a widget's header and build them.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;document&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelectorAll&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultDropdownInWidgetHeaderSelector&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;forEach&lt;/span&gt;&lt;span class="punctuation"&gt;((&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'click'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;bootstrap&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - type;Semantic - (TRANSIENT)"&gt;Dropdown&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - static symbol;Semantic - text;Semantic - (TRANSIENT)"&gt;getOrCreateInstance&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;).&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;toggle&lt;/span&gt;&lt;span class="punctuation"&gt;());&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;span class="comment"&gt;&lt;br /&gt;&lt;strong&gt;    // Grab all mimimize/maximize buttons and assign onClicks&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;document&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelectorAll&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetStateSelector&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;forEach&lt;/span&gt;&lt;span class="punctuation"&gt;((&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'click'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;Event&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;setWidgetState&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;/strong&gt;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Our &lt;code&gt;setWidgetState()&lt;/code&gt; method handles the saving of our widget passing the data over to the Tuxboard service.&amp;nbsp;&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;setWidgetState&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;Event&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;target&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;target&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getClosestByClass&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;target&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;noPeriod&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetSelector&lt;/span&gt;&lt;span class="punctuation"&gt;))&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;HTMLDivElement&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetState&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getWidgetState&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetState&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;collapsed&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;!&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetState&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;collapsed&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;service&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;setWidgetState&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetState&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetState&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;collapsed&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;then&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;response&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;response&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;ok&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;updateWidgetState&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetState&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetState&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;collapsed&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;response&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt; 
&lt;/pre&gt;
&lt;p&gt;If we receive an Ok from the response, we proceed to update the widget state by setting the proper attributes to either minimized or restored through the &lt;code&gt;updateWidgetState()&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;updateWidgetState&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;collapsed&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;boolean&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getWidget&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;id&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetStateButton&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelector&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetStateSelector&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetStateButton&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelector&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'i'&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;collapsed&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;classList&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;add&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;collapsedToggleSelector&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetStateButton&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;setAttribute&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'title'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;'Restore'&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;setAttribute&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'class'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;'fa-regular&amp;nbsp;fa-window-maximize'&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;classList&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;remove&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;collapsedToggleSelector&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;widgetStateButton&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;setAttribute&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'title'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;'Minimize'&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;setAttribute&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'class'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;'fa-solid&amp;nbsp;fa-window-minimize'&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;We locate the widget in the dashboard and retrieve it's state button and the icon(s) represented by the 'i' tag.&lt;/p&gt;
&lt;p&gt;If the widget collapses, we add a &lt;code&gt;collapsedToggleSelector&lt;/code&gt; class to the widget, change the title of the button (for UX purposes), and use FontAwesome's classes to change the button from a minimize to restore and vice-versa.&lt;/p&gt;
&lt;h3&gt;Smooth Minimizing/Restoring using CSS&lt;/h3&gt;
&lt;p&gt;One nice touch of minimizing and restoring a widget's state is the animating of the widget's state.&lt;/p&gt;
&lt;p&gt;We can use CSS to perform these transitions in our &lt;code&gt;tuxboard.scss&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;wwwroot/scss/tuxboard.scss&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="csscode"&gt;&lt;span class="CSS Selector"&gt;.card-body&lt;/span&gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="CSS Property Name"&gt;display&lt;/span&gt;:&amp;nbsp;&lt;span class="CSS Property Value"&gt;grid&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="CSS Property Name"&gt;grid-template-rows&lt;/span&gt;:&amp;nbsp;&lt;span class="CSS Property Value"&gt;1fr&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="CSS Property Name"&gt;transition&lt;/span&gt;:&amp;nbsp;&lt;span class="CSS Property Value"&gt;grid-template-rows&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Property Value"&gt;.3s&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Property Value"&gt;ease-in-out&lt;/span&gt;,&amp;nbsp;&lt;span class="CSS Property Value"&gt;opacity&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Property Value"&gt;.1s&lt;/span&gt;,&amp;nbsp;&lt;span class="CSS Property Value"&gt;padding&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Property Value"&gt;.1s&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="CSS Property Name"&gt;opacity&lt;/span&gt;:&amp;nbsp;&lt;span class="CSS Property Value"&gt;1&lt;/span&gt;;
}
&lt;span class="CSS Selector"&gt;&lt;br /&gt;.card.collapsed&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Selector"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Selector"&gt;.card-body&lt;/span&gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="CSS Property Name"&gt;grid-template-rows&lt;/span&gt;:&amp;nbsp;&lt;span class="CSS Property Value"&gt;0fr&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="CSS Property Name"&gt;opacity&lt;/span&gt;:&amp;nbsp;&lt;span class="CSS Property Value"&gt;0&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="CSS Property Name"&gt;padding&lt;/span&gt;:&amp;nbsp;&lt;span class="CSS Property Value"&gt;0&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="CSS Property Name"&gt;transition&lt;/span&gt;:&amp;nbsp;&lt;span class="CSS Property Value"&gt;grid-template-rows&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Property Value"&gt;.3s&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Property Value"&gt;ease-in-out&lt;/span&gt;,&amp;nbsp;&lt;span class="CSS Property Value"&gt;opacity&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Property Value"&gt;.1s&lt;/span&gt;,&amp;nbsp;&lt;span class="CSS Property Value"&gt;padding&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Property Value"&gt;.1s&lt;/span&gt;;
}
&lt;span class="CSS Selector"&gt;&lt;br /&gt;.card-body&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Selector"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="CSS Selector"&gt;div&lt;/span&gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="CSS Property Name"&gt;overflow&lt;/span&gt;:&amp;nbsp;&lt;span class="CSS Property Value"&gt;hidden&lt;/span&gt;;
}
&lt;/pre&gt;
&lt;p&gt;With our standard card body, we change it to a grid which makes everything in the body as a template row. This allows our content to expand as necessary without pixel units. The &lt;code&gt;fr&lt;/code&gt; stands for 1 Fractional Unit. If we set the fractional unit to 0, it shrinks. If it's set to 1, it displays the entire row.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;transition&lt;/code&gt; acts on changes to the grid-template-rows, opacity, and padding changes with duration settings. Once we change any of these properties, it performs the transition.&lt;/p&gt;
&lt;p&gt;To make all of this work, the last line pointing to a &lt;code&gt;div&lt;/code&gt; tag hides the content in the card body. In our widget template, we require a &lt;code&gt;div&lt;/code&gt; to wrap around the content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Pages/Shared/Components/WidgetTemplate/Default.cshtml&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;.&lt;br /&gt;.&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;card-body&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="keyword;Semantic - keyword;Syntactic - (TRANSIENT)"&gt;await&lt;/span&gt;&lt;span class="keyword"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Component&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Semantic - method name;Syntactic - (TRANSIENT)"&gt;InvokeAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Widget&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Name&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;This technique was taken from Chris Coyer's post titled &lt;a href="https://chriscoyier.net/2022/12/21/things-css-could-still-use-heading-into-2023/" title="Go to Things CSS Could Still Use Heading Into 2023 on chriscoyier.net"&gt;Things CSS Could Still Use Heading Into 2023&lt;/a&gt;. The ability to show/hide items using fractional units makes transitions easier to work with.&lt;/p&gt;
&lt;h3&gt;The Final Result&lt;/h3&gt;
&lt;p&gt;With everything in place, we can see how our minimize/restore button works on a particular widget.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-widget-toolbar-minimize.gif" title="Animation: Minimizing and restoring a widget" alt="Minimizing and restoring a widget" class="img-fluid no-float" width="820" height="503" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We covered a lot of material in this post by adding two types of toolbars to a widget: immediate buttons for quick actions and a dropdown menu for additional functionality specific to widgets.&lt;/p&gt;
&lt;p&gt;Here are a couple guidelines I've used in past dashboards:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Too many toolbar buttons on a widget may overwhelm the user. Keep the widget's toolbar to a maximum of three buttons.&lt;/li&gt;
&lt;li&gt;The buttons on a widget's toolbar should be quick, one-click functionality not impeding the user's experience (&lt;strong&gt;non-destructive or cosmetic&lt;/strong&gt;). For example, the minimize/restore button would be considered a quick-access, essential, and commonly-used button.&lt;/li&gt;
&lt;li&gt;For more &lt;strong&gt;detailed or destructive&lt;/strong&gt; widget functions, the dropdown menu would create a better experience for users. The remove widget option would be considered a destructive or manipulative button to place in a dropdown since it can't be clicked accidentally.&lt;/li&gt;
&lt;li&gt;If you have too many options in a widget's dropdown, identify which items are absolutely critical to the widget. Could the item be moved out to a dialog? Also ask whether the item could be moved to a higher-level, possibly the &lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Tuxbar&lt;/a&gt; for global widget functionality or settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following is a list of widget functions I've included in dashboards over the years.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove&lt;/li&gt;
&lt;li&gt;Refresh&lt;/li&gt;
&lt;li&gt;Duplicate&lt;/li&gt;
&lt;li&gt;Properties/Settings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While some of these functions are considered essential, again, we don't want to overwhelm the user with too many options.&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4" title="Go to Adding Widgets with a Tuxboard Dialog"&gt;Adding Widgets with a Tuxboard Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB" title="Go to Creating Custom Tuxboard Widgets"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;&lt;ul class="list-inline link-list"&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://www.linkedin.com/in/jonathandanylko" title="LinkedIn Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/linkedin_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://twitter.com/jdanylko" title="Twitter Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/twitter_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://instagram.com/jdanylko" title="Instagram Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/instagram-16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jonathan "JD" Danylko is an author, web architect, and entrepreneur who's been programming for over 30 years. He's developed websites for small, medium, and Fortune 500 companies since 1996.&lt;/p&gt;
&lt;p&gt;He currently works at &lt;a href="https://www.danylkoweb.com/Blog/growing-up-with-insight-O4" title="Go to Growing up with Insight"&gt;Insight Enterprises&lt;/a&gt; as an Architect.&lt;/p&gt;
&lt;p&gt;When asked what he likes to do in his spare time, he replies, "I like to write and I like to code. I also like to write about code."&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Fri, 12 Jul 2024 00:00:00 -0700</pubDate></item><item><guid isPermaLink="false">ac1994bd-b59c-426f-b0ff-ea4dbf517dc9</guid><link>https://www.danylkoweb.com/Blog/adding-widgets-with-a-tuxboard-dialog-U4</link><title>Adding Widgets with a Tuxboard Dialog</title><description>&lt;p&gt;By Jonathan "JD" Danylko&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tuxboard requires a way to add multiple widgets to a dashboard. In this post, we'll create an AddWidgetDialog for just such a purpose&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-add-widgets.jpg" alt="Collection of Legos" title="Widgets are like Legos for Dashboards" class="img-fluid no-float" width="640" height="427" /&gt;&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Adding Widgets with a Tuxboard Dialog&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB" title="Go to Creating Custom Tuxboard Widgets"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;One of the best features of a dashboard is to personalize it by adding widgets.&lt;/p&gt;
&lt;p&gt;In this post, we'll borrow techniques from past posts and implement a new Add Widget dialog similar to how we created the &lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Simple Layout dialog&lt;/a&gt; and the &lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Advanced Layout dialog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Creating the Boilerplate Dialog&lt;/h2&gt;
&lt;p&gt;The add widget dialog isn't any different from the other dialogs. We simply create the standard boilerplate HTML in our Tuxboard main page (which in this case is the &lt;code&gt;Index.cshtml&lt;/code&gt;).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Pages/index.cshtml&lt;/code&gt;&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="HTML Comment;Semantic - HTML Comment;Syntactic - (TRANSIENT)"&gt;.&lt;br /&gt;.&lt;br /&gt;&amp;lt;!--&lt;/span&gt;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;&amp;nbsp;Add&amp;nbsp;Widget&amp;nbsp;&lt;/span&gt;&lt;span class="HTML Comment;Syntactic - HTML Comment;Semantic - (TRANSIENT)"&gt;--&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;modal&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fade&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;add-widget-dialog&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;tabindex&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;-1&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;role&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;dialog&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;modal-dialog&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;role&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;document&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;modal-content&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;modal-header&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;h5&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;modal-title&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;Add&amp;nbsp;Widget&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;h5&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn-close&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;data-bs-dismiss&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;modal&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;aria-label&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;Close&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;modal-body&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;h-100&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;justify-content-center&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;text-center&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fas&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-spinner&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-spin&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-2x&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;modal-footer&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-sm&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-primary&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;add-widget&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;Add&amp;nbsp;Widget&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-sm&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-secondary&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;data-bs-dismiss&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;modal&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;Close&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;For the add widget dialog, we'll aptly name it "add-widget-dialog". Don't forget to create the constant name in the &lt;code&gt;common.ts&lt;/code&gt; so we can refer to it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wwwroot/src/tuxboard/common.ts&lt;/code&gt;&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="keyword - control"&gt;export&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;defaultAddWidgetDialogSelector&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"#add-widget-dialog"&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Once we have a way to identify the dialog, we can begin building the main body of the dialog using a ViewComponent.&lt;/p&gt;
&lt;h2&gt;Building the AddWidgetDialog ViewComponent&lt;/h2&gt;
&lt;p&gt;To create the body of our Add Widget dialog, the widgets need to have some sort of organization; we can't just throw down a large amount of widgets and expect the user to wade through every single one of them.&lt;/p&gt;
&lt;p&gt;One of the fields in the Widget table is GroupName. This field is used to segment the widgets into common themes.&lt;/p&gt;
&lt;p&gt;To display the widgets, we'll use a &lt;a href="https://getbootstrap.com/docs/5.3/components/navs-tabs/#javascript-behavior" title="Go to JavaScript behaviors w/ navs and tabs on getbootstrap.com"&gt;basic JavaScript Bootstrap Tabs interface&lt;/a&gt;. We'll place the group names on the left with a list of widgets in that group on the right.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Pages/Shared/Components/AddWidgetDialog/Default.cshtml&lt;/code&gt;&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorDirective;Semantic - (TRANSIENT)"&gt;model&lt;/span&gt;&amp;nbsp;&lt;span class="namespace name"&gt;Add_Widgets&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Pages&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Shared&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;Components&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="namespace name"&gt;AdvancedLayoutDialog&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="class name"&gt;AddWidgetModel&lt;/span&gt;
&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Syntactic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;groups&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Widgets&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - method name;Syntactic - (TRANSIENT)"&gt;GroupBy&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name;Syntactic - parameter name;Semantic - (TRANSIENT)"&gt;e&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - parameter name;Semantic - (TRANSIENT)"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;GroupName&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Syntactic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;groupList&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;groups&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - method name;Syntactic - (TRANSIENT)"&gt;Select&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name;Syntactic - parameter name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - parameter name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Key&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;}&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;d-flex&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;align-items-start&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;nav&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;flex-column&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;nav-pills&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;me-3&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;v-pills-tab&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;role&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;tablist&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;aria-orientation&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;vertical&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="keyword - control;Syntactic - keyword - control;Semantic - (TRANSIENT)"&gt;foreach&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword;Syntactic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;groupName&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control;Semantic - keyword - control;Syntactic - (TRANSIENT)"&gt;in&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;groupList&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Syntactic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;normalizedGroupName&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;groupName&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Semantic - method name;Syntactic - (TRANSIENT)"&gt;Replace&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string;Syntactic - string;Semantic - (TRANSIENT)"&gt;"&amp;nbsp;"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string;Semantic - string;Syntactic - (TRANSIENT)"&gt;"_"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - method name;Semantic - (TRANSIENT)"&gt;ToLower&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;nav-link&lt;/span&gt;&amp;nbsp;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="RazorTransition"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;groupName&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Widgets&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;First&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;GroupName&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"active"&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;""&lt;/span&gt;&lt;span class="RazorTransition"&gt;)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;v-pills-&lt;/span&gt;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="RazorTransition"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;normalizedGroupName&lt;/span&gt;&lt;span class="RazorTransition"&gt;)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;-tab&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;data-bs-toggle&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;pill&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;data-bs-target&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;#v-pills-&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="RazorTransition"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;normalizedGroupName&lt;/span&gt;&lt;span class="RazorTransition"&gt;)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;role&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;tab&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;aria-controls&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;v-pills-&lt;/span&gt;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="RazorTransition"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;normalizedGroupName&lt;/span&gt;&lt;span class="RazorTransition"&gt;)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;aria-selected&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;true&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;groupName&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;tab-content&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;flex-fill&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;v-pills-tabContent&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="keyword - control;Semantic - keyword - control;Syntactic - (TRANSIENT)"&gt;foreach&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword;Syntactic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;groupName&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control;Semantic - keyword - control;Syntactic - (TRANSIENT)"&gt;in&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;groupList&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Syntactic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;normalizedGroupName&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;groupName&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - method name;Semantic - (TRANSIENT)"&gt;Replace&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string;Semantic - string;Syntactic - (TRANSIENT)"&gt;"&amp;nbsp;"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="string;Syntactic - string;Semantic - (TRANSIENT)"&gt;"_"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - method name;Semantic - (TRANSIENT)"&gt;ToLower&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;tab-pane&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fade&lt;/span&gt;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="RazorTransition"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;groupName&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;Widgets&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name"&gt;First&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;GroupName&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"&amp;nbsp;show&amp;nbsp;active"&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;""&lt;/span&gt;&lt;span class="RazorTransition"&gt;)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;v-pills-&lt;/span&gt;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="RazorTransition"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;normalizedGroupName&lt;/span&gt;&lt;span class="RazorTransition"&gt;)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;role&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;tabpanel&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;aria-labelledby&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;v-pills-&lt;/span&gt;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="RazorTransition"&gt;(&lt;/span&gt;&lt;span class="local name"&gt;normalizedGroupName&lt;/span&gt;&lt;span class="RazorTransition"&gt;)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;-tab&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;tabindex&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;0&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;ul&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;list-group&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="keyword - control;Syntactic - keyword - control;Semantic - (TRANSIENT)"&gt;foreach&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword;Syntactic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;widget&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control;Syntactic - keyword - control;Semantic - (TRANSIENT)"&gt;in&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Model&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Widgets&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - method name;Syntactic - (TRANSIENT)"&gt;Where&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name;Syntactic - parameter name;Semantic - (TRANSIENT)"&gt;e&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - parameter name;Semantic - (TRANSIENT)"&gt;e&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;GroupName&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;groupName&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;li&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;list-group-item&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;list-group-item-action&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;data-id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="RazorTransition"&gt;@&lt;/span&gt;&lt;span class="local name"&gt;widget&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="property name"&gt;WidgetId&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="method name"&gt;ToString&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;d-flex&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;w-100&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;h5&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;mb-1&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Title&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;h5&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;p&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;mb-1&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fst-italic&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="RazorDirective;Syntactic - RazorTransition;Semantic - (TRANSIENT)"&gt;@&lt;/span&gt;&lt;span class="identifier;Syntactic - local name;Semantic - (TRANSIENT)"&gt;widget&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Syntactic - property name;Semantic - (TRANSIENT)"&gt;Description&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;p&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;li&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;ul&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Pages/Shared/Components/AddWidgetDialog/AddWidgetModel.cs&lt;/code&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;AddWidgetModel&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;List&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;WidgetDto&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="property name"&gt;Widgets&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Pages/Shared/Components/AddWidgetDialog/AddWidgetViewComponent.cs&lt;/code&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="punctuation"&gt;[&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ViewComponent&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Name&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"addwidgetdialog"&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;
&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name"&gt;AddWidgetDialogViewComponent&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ViewComponent&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IViewComponentResult&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;Invoke&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;AddWidgetModel&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;model&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;View&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;model&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;With our ViewComponent created, we can go back to our &lt;code&gt;Index.cshtml.cs&lt;/code&gt; and return the body of the dialog.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Pages/index.cshtml.cs&lt;/code&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="comment"&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;/* Add Widget Dialog */&lt;/span&gt;
&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IActionResult&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;OnPostAddWidgetsDialog&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;widgets&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetWidgetsAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Select&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="parameter name"&gt;r&lt;/span&gt;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;r&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ToDto&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="extension method name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;ToList&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;ViewComponent&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"addwidgetdialog"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;AddWidgetModel&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;Widgets&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;widgets&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;We retrieve all of the widgets available, build our DTO (Data Transfer Objects) to pass them on to the AddWidgetDialog ViewComponent, and pass the result back to our JavaScript.&lt;/p&gt;
&lt;h2&gt;Building the AddWidgetDialog class in TypeScript&lt;/h2&gt;
&lt;p&gt;Our AddWidgetDialog class is very similar to other dialogs and require only a couple events to implement the functionality.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When a user clicks on a widget item, it removes a &lt;code&gt;.active&lt;/code&gt;&amp;nbsp;CSS class from all other widget items (LI tags) and assigns it what they selected.&lt;/li&gt;
&lt;li&gt;Clicking the Add Widget button performs a post to a service and immediately adds the widget to the dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As expected, the class is small, but definitely an easy dialog to implement.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wwwroot/src/tuxboard/dialog/addWidget/AddWidgetDialog.ts&lt;/code&gt;&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="keyword - control"&gt;export&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Syntactic - text;Semantic - type;Semantic - (TRANSIENT)"&gt;AddWidgetDialog&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - type;Semantic - (TRANSIENT)"&gt;BaseDialog&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;allowRefresh&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;boolean&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;constructor&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;selector&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;tuxboard&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type;Semantic - type;Syntactic - (TRANSIENT)"&gt;Tuxboard&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;super&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;selector&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;initialize&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;initialize&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getDom&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'shown.bs.modal'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;loadDialog&lt;/span&gt;&lt;span class="punctuation"&gt;());&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;getService&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;tuxboard&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getService&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;getAddWidgetButton&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getDom&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelector&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultAddButtonSelector&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="keyword - control"&gt;as&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;HTMLButtonElement&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;getWidgetItems&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getDom&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelectorAll&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetListItemSelector&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;loadDialog&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getService&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getAddWidgetDialog&lt;/span&gt;&lt;span class="punctuation"&gt;()&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;then&lt;/span&gt;&lt;span class="punctuation"&gt;((&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;data&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getDom&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelector&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'.modal-body'&lt;/span&gt;&lt;span class="punctuation"&gt;).&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;innerHTML&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;data&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;attachEvents&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;getSelected&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getDom&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelector&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"li"&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;+&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetSelectionSelector&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;getSelectedId&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getSelected&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;getAttribute&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;dataIdAttribute&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;clearSelected&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;Array&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;from&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getWidgetItems&lt;/span&gt;&lt;span class="punctuation"&gt;()).&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;forEach&lt;/span&gt;&lt;span class="punctuation"&gt;((&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;HTMLLIElement&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;classList&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;remove&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;noPeriod&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetSelectionSelector&lt;/span&gt;&lt;span class="punctuation"&gt;));&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;})&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;attachEvents&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;items&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getWidgetItems&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;Array&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;from&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;items&lt;/span&gt;&lt;span class="punctuation"&gt;).&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;forEach&lt;/span&gt;&lt;span class="punctuation"&gt;((&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;HTMLLIElement&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;removeEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'click'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;listItemOnClick&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;'click'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;listItemOnClick&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;})&lt;/span&gt;
&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addButton&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getAddWidgetButton&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addButton&lt;/span&gt;&lt;span class="punctuation"&gt;?.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;removeEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"click"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;addWidgetToLayout&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addButton&lt;/span&gt;&lt;span class="punctuation"&gt;?.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"click"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;addWidgetToLayout&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;listItemOnClick&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Syntactic - type;Semantic - (TRANSIENT)"&gt;HTMLLIElement&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;clearSelected&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;item&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;classList&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;add&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;noPeriod&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultWidgetSelectionSelector&lt;/span&gt;&lt;span class="punctuation"&gt;));&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addWidgetToLayout&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;Event&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;preventDefault&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;stopImmediatePropagation&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getService&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;addWidget&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getSelectedId&lt;/span&gt;&lt;span class="punctuation"&gt;())&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;then&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;allowRefresh&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;hideDialog&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;})&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;loadDialog()&lt;/code&gt; method gets the service (&lt;code&gt;TuxboardService.ts&lt;/code&gt;), performs a post to get the AddWidgetDialog body, and assigns the result of the ViewComponent to the ".modal-body" of our Bootstrap dialog.&lt;/p&gt;
&lt;p&gt;Once we have the dialog loaded, we need to attach the events to our DOM elements, mainly all of the widgets and the Add Widget button (located in the &lt;code&gt;attachEvents()&lt;/code&gt; method).&lt;/p&gt;
&lt;p&gt;Our &lt;code&gt;addWidgetToLayout()&lt;/code&gt; method occurs when clicking the "Add Widget" button. We stop any additional click events from happening and call the addWidget service. When it returns, we set the &lt;code&gt;allowRefresh&lt;/code&gt; property to true and hide the dialog.&lt;/p&gt;
&lt;p&gt;We'll continue discussing this flow below in the Tuxbar's AddWidget button.&lt;/p&gt;
&lt;h2&gt;Creating the Services&lt;/h2&gt;
&lt;p&gt;We now have an &lt;code&gt;AddWidgetDialog&lt;/code&gt; class, but no services.&lt;/p&gt;
&lt;p&gt;If we look at the class, we need two services: one to retrieve the body of the dialog and one to add our selected widget.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wwwroot/src/tuxboard/services/tuxboardService.ts&lt;/code&gt;&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="keyword"&gt;.&lt;br /&gt;.&lt;br /&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;tuxAddWidgetDialogUrl&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"?handler=AddWidgetsDialog"&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="keyword"&gt;.&lt;br /&gt;.&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;getAddWidgetDialog&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - type;Semantic - (TRANSIENT)"&gt;Request&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;tuxAddWidgetDialogUrl&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;method&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"post"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;headers&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;'Content-Type'&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;'application/json'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;'RequestVerificationToken'&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getToken&lt;/span&gt;&lt;span class="punctuation"&gt;(),&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;fetch&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;then&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;validateResponse&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;then&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;readResponseAsText&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;catch&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;logError&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;getAddWidgetDialog()&lt;/code&gt; method doesn't need anything at this point. Make the call and return the code.&lt;/p&gt;
&lt;p&gt;Since we're here, we might as well create the &lt;code&gt;AddWidget()&lt;/code&gt; service for actually adding the widget to the dashboard.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wwwroot/src/tuxboard/services/tuxboardService.ts&lt;/code&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;.&lt;br /&gt;.&lt;br /&gt;private&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;tuxAddWidgetUrl&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"?handler=AddWidget"&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
.&lt;br /&gt;.&lt;br /&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addWidget&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;widgetId&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;postData&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;WidgetId&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;widgetId&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;};&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - type;Semantic - (TRANSIENT)"&gt;Request&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;tuxAddWidgetUrl&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;method&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"post"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;body&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - text;Semantic - (TRANSIENT)"&gt;JSON&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;stringify&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;postData&lt;/span&gt;&lt;span class="punctuation"&gt;),&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - parameter name;Syntactic - text;Semantic - (TRANSIENT)"&gt;headers&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;'Content-Type'&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;'application/json'&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="parameter name"&gt;'RequestVerificationToken'&lt;/span&gt;&lt;span class="punctuation"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getToken&lt;/span&gt;&lt;span class="punctuation"&gt;(),&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;});&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;fetch&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;then&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;validateResponse&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;then&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;readResponseAsText&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;catch&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;logError&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;WidgetId&lt;/code&gt; we pass into the service is the &lt;code&gt;data-id&lt;/code&gt; associated with the list item of the widget from the HTML. Refer to the TypeScript methods &lt;code&gt;getSelected()&lt;/code&gt; and &lt;code&gt;getSelectedId()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We simply pass in the widget id they selected and send it back to the server for processing.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Pages/index.cshtml.cs&lt;/code&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword"&gt;.&lt;br /&gt;.&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;async&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;Task&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="identifier;Semantic - interface name;Semantic - (TRANSIENT)"&gt;IActionResult&lt;/span&gt;&lt;span class="punctuation"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="method name"&gt;OnPostAddWidgetAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;[&lt;/span&gt;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;FromBody&lt;/span&gt;&lt;span class="punctuation"&gt;]&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;AddWidgetRequest&lt;/span&gt;&amp;nbsp;&lt;span class="parameter name"&gt;request&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;dashboard&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetDashboardAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_config&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;baseWidget&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetWidgetAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - parameter name;Semantic - (TRANSIENT)"&gt;request&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - property name;Semantic - (TRANSIENT)"&gt;WidgetId&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;layoutRow&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;dashboard&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;GetFirstLayoutRow&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;layoutRow&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword;Semantic - keyword;Semantic - (TRANSIENT)"&gt;var&lt;/span&gt;&amp;nbsp;&lt;span class="local name"&gt;placement&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;layoutRow&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;CreateFromWidget&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;baseWidget&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;placement&amp;nbsp;object&amp;nbsp;can&amp;nbsp;be&amp;nbsp;set&amp;nbsp;to&amp;nbsp;any&amp;nbsp;other&amp;nbsp;layout&amp;nbsp;row&amp;nbsp;chosen;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;default&amp;nbsp;is&amp;nbsp;first&amp;nbsp;layout&amp;nbsp;row,&amp;nbsp;first&amp;nbsp;column.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;await&lt;/span&gt;&amp;nbsp;&lt;span class="field name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;_service&lt;/span&gt;&lt;span class="operator"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - method name;Semantic - (TRANSIENT)"&gt;AddWidgetPlacementAsync&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Semantic - (TRANSIENT)"&gt;placement&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Semantic - identifier;Semantic - (TRANSIENT)"&gt;OkResult&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Once we have our base widget, we get the first layout row, create a WidgetPlacement object for that layout row, and save it.&lt;/p&gt;
&lt;p&gt;In this code example, when we add a widget, Tuxboard places it in the first column of the first layout row. For more flexibility, widgets can be added to any layout row using a LayoutRow instance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Editor's Note:&lt;/strong&gt; &lt;em&gt;In this AddWidget post method, we return an &lt;code&gt;OkResult()&lt;/code&gt; and not a rendered "tuxboardtemplate". Why not? It's a matter of preference and this was a quick example. On one hand, we're returning an &lt;code&gt;OkResult()&lt;/code&gt; and then performing a refresh. On the other hand, we're &lt;/em&gt;&lt;em&gt;returning a &lt;code&gt;ViewComponent("tuxboardtemplate",model)&lt;/code&gt; and attaching events to DOM model results. The former technique requires an additional API request. While I thought about this and decided to go with the lazy (first) approach of calling the &lt;code&gt;refresh()&lt;/code&gt; method, it may be a better approach to return the ViewComponent instead of the &lt;code&gt;OkResult()&lt;/code&gt; for performance reasons.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Adding the Tuxbar Button&lt;/h2&gt;
&lt;p&gt;Our Tuxbar button will have a simple plus symbol on it for adding widgets (changes in &lt;strong&gt;bold&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Pages/Shared/Components/Tuxbar/Default.cshtml&lt;/code&gt;&lt;/p&gt;
&lt;pre class="htmlcode"&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;tuxbar&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-toolbar&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;border&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;border-1&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;bg-light&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;p-1&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;mb-3&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;justify-content-between&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;role&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;toolbar&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;aria-label&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;Tuxbar&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;for&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;Tuxboard&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;form&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn-group&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-group-sm&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;refresh-button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;title&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;Refresh&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-outline-secondary&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fa&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-arrows-rotate&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;add-widget-button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;title&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;Add&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;Widget&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-outline-secondary&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fa-regular&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-square-plus&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn-group&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-group-sm&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;layout-button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;title&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;Change&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;Layout&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;(simple)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-outline-secondary&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fa&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-table-columns&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;button&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;type&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;advanced-layout-button&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;title&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;Change&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;Layout&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;(advanced)&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-outline-secondary&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fa&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-table-list&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;button&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;btn-group&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;btn-group-sm&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;mx-2&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;tuxbar-status&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;span&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - RazorTagHelperElement;Semantic - (TRANSIENT)"&gt;form&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Semantic - HTML Operator;Syntactic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;input-group&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;mx-3&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;span&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;id&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;tuxbar-spinner&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;hidden&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&amp;nbsp;&lt;span class="HTML Attribute Name"&gt;class&lt;/span&gt;&lt;span class="HTML Operator;Syntactic - HTML Operator;Semantic - (TRANSIENT)"&gt;=&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;fa-solid&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-sync&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;&amp;nbsp;fa-spin&lt;/span&gt;&lt;span class="HTML Attribute Value"&gt;"&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;i&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;span&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Syntactic - HTML Element Name;Semantic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="HTML Tag Delimiter;Semantic - HTML Tag Delimiter;Syntactic - (TRANSIENT)"&gt;&amp;lt;&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;/&lt;/span&gt;&lt;span class="HTML Element Name;Semantic - HTML Element Name;Syntactic - (TRANSIENT)"&gt;div&lt;/span&gt;&lt;span class="HTML Tag Delimiter;Syntactic - HTML Tag Delimiter;Semantic - (TRANSIENT)"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Again, add a string constant in the &lt;code&gt;common.ts&lt;/code&gt; to identify the &lt;code&gt;add-widget-button&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="keyword - control"&gt;export&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;defaultAddWidgetButton&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;"#add-widget-button"&lt;/span&gt;&lt;span class="punctuation"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;AddWidgetButton&lt;/code&gt; class ties everything together by attaching a click event to the button, creating the &lt;code&gt;AddWidgetDialog&lt;/code&gt; instance, and refreshing the dashboard.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wwwroot/src/tuxboard/tuxbar/AddWidgetButton.ts&lt;/code&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="keyword - control"&gt;export&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span class="class name;Syntactic - text;Semantic - type;Semantic - (TRANSIENT)"&gt;AddWidgetButton&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;extends&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Syntactic - type;Semantic - (TRANSIENT)"&gt;TuxbarButton&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;constructor&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;tb&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type;Syntactic - type;Semantic - (TRANSIENT)"&gt;Tuxbar&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;sel&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type"&gt;string&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;super&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;tb&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;sel&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;element&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getDom&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;element&lt;/span&gt;&lt;span class="punctuation"&gt;?.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;removeEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"click"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;onClick&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;element&lt;/span&gt;&lt;span class="punctuation"&gt;?.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"click"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;onClick&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;onClick&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="UnnecessaryCodeDiagnostic - identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;ev&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="text;Semantic - type;Semantic - type;Syntactic - (TRANSIENT)"&gt;MouseEvent&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;dialog&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - type;Semantic - (TRANSIENT)"&gt;AddWidgetDialog&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultAddWidgetDialogSelector&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;tuxBar&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getTuxboard&lt;/span&gt;&lt;span class="punctuation"&gt;());&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;dialog&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;dialog&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getDom&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;removeEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"hide.bs.modal"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;refresh&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;dialog&lt;/span&gt;&lt;span class="punctuation"&gt;),&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;dialog&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getDom&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;addEventListener&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"hide.bs.modal"&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;refresh&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;dialog&lt;/span&gt;&lt;span class="punctuation"&gt;),&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;dialog&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;showDialog&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;};&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;refresh&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;dialog&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="type;Syntactic - type;Semantic - (TRANSIENT)"&gt;AddWidgetDialog&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword - control"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;dialog&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;allowRefresh&lt;/span&gt;&lt;span class="punctuation"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;tuxBar&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getTuxboard&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;refresh&lt;/span&gt;&lt;span class="punctuation"&gt;();&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;}&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="punctuation"&gt;};&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;getDom&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;tuxBar&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - (TRANSIENT)"&gt;getDom&lt;/span&gt;&lt;span class="punctuation"&gt;().&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;querySelector&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;selector&lt;/span&gt;&lt;span class="punctuation"&gt;);&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;When we hide the dialog, we check the &lt;code&gt;allowRefresh&lt;/code&gt; property. If true, we refresh the dashboard. As mentioned above in the Editor's Note, we could've returned a full &lt;code&gt;tuxboardtemplate&lt;/code&gt; ViewComponent/HTML and set it through the .innerHTML property.&lt;/p&gt;
&lt;p&gt;Finally, we add the button to the Tuxbar (changes in &lt;strong&gt;bold&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wwwroot/src/tuxboard/tuxbar/Tuxbar.ts&lt;/code&gt;&lt;/p&gt;
&lt;pre class="javascriptcode"&gt;&lt;span class="keyword"&gt;.&lt;br /&gt;.&lt;br /&gt;public&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;initialize&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;()&lt;/span&gt;&amp;nbsp;&lt;span class="operator"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="punctuation"&gt;{&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;controls&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;push&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - type;Semantic - (TRANSIENT)"&gt;RefreshButton&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultTuxbarRefreshButton&lt;/span&gt;&lt;span class="punctuation"&gt;));&lt;/span&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;controls&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;push&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - type;Semantic - (TRANSIENT)"&gt;AddWidgetButton&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultAddWidgetButton&lt;/span&gt;&lt;span class="punctuation"&gt;));&lt;/span&gt;
&lt;/strong&gt; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;controls&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;push&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - type;Semantic - (TRANSIENT)"&gt;SimpleLayoutButton&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultSimpleLayoutButton&lt;/span&gt;&lt;span class="punctuation"&gt;));&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;controls&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;push&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - type;Semantic - (TRANSIENT)"&gt;AdvancedLayoutButton&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultAdvancedLayoutButton&lt;/span&gt;&lt;span class="punctuation"&gt;));&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;controls&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;push&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - type;Semantic - (TRANSIENT)"&gt;TuxbarMessage&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultTuxbarMessageSelector&lt;/span&gt;&lt;span class="punctuation"&gt;));&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="identifier;Semantic - local name;Syntactic - (TRANSIENT)"&gt;controls&lt;/span&gt;&lt;span class="punctuation"&gt;.&lt;/span&gt;&lt;span class="method name;Syntactic - text;Semantic - text;Semantic - (TRANSIENT)"&gt;push&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span class="method name;Syntactic - type;Semantic - (TRANSIENT)"&gt;TuxbarSpinner&lt;/span&gt;&lt;span class="punctuation"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span class="punctuation"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="identifier;Semantic - local name;Syntactic - text;Semantic - (TRANSIENT)"&gt;defaultTuxbarSpinnerSelector&lt;/span&gt;&lt;span class="punctuation"&gt;));&lt;/span&gt;
&lt;span class="punctuation"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Once we have our buttons on the toolbar, we can see how the dialog works.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.danylkoweb.com/content/images/tuxboard-add-widget.gif" alt="Animation of the Add Widget dialog" title="Animation of the Add Widget dialog" class="img-fluid no-float" /&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this post, we created a fundamental Add Widget dialog so users can add any widget to their dashboard.&lt;/p&gt;
&lt;p&gt;This fundamental dialog will become extremely helpful in future posts while demonstrating a number of features to expand on this technique.&lt;/p&gt;
&lt;div class="alert alert-info pb-0 mb-3"&gt;
&lt;h4 class="alert-heading"&gt;What's Next?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/introducing-tuxboard-SY" title="Go to Introducing Tuxboard"&gt;Introducing Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/layout-of-a-tuxboard-dashboard-T0" title="Go to Layout of a Tuxboard dashboard"&gt;Layout of a Tuxboard dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/dashboard-modularity-using-tuxboard-TD" title="Go to Dashboard Modularity using Tuxboard"&gt;Dashboard Modularity using Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/moving-widgets-in-tuxboard-TE" title="Go to Moving Widgets in Tuxboard"&gt;Moving Widgets in Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-a-tuxbar-for-tuxboard-TL" title="Go to Creating a Tuxbar for Tuxboard"&gt;Creating a Tuxbar for Tuxboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-simple-layout-dialog-U2" title="Go to Managing Layouts in Tuxboard: Simple Layout Dialog"&gt;Managing Layouts in Tuxboard: Simple Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/managing-layouts-in-tuxboard-advanced-layout-dialog-U3" title="Go to Managing Layouts in Tuxboard: Advanced Layout Dialog"&gt;Managing Layouts in Tuxboard: Advanced Layout Dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Adding Widgets with a Tuxboard Dialog&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/using-widget-toolbars-or-deleting-widgets-U6" title="Go to Using Widget Toolbars (or Deleting Widgets)"&gt;Using Widget Toolbars (or Deleting Widgets)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-user-specific-dashboards-U7" title="Go to Create User-Specific Dashboards"&gt;Creating User-Specific Dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-dashboards-using-roles-U8" title="Go to Creating Default Dashboards with Tuxboard"&gt;Creating Default Dashboards using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-default-widgets-using-roles-UA" title="Go to Creating Default Widgets using Roles"&gt;Creating Default Widgets using Roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danylkoweb.com/Blog/creating-custom-tuxboard-widgets-UB" title="Go to Creating Custom Tuxboard Widgets"&gt;Creating Custom Tuxboard Widgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full examples located at &lt;a href="https://github.com/jdanylko/Tuxboard.Examples"&gt;Tuxboard.Examples&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;&lt;ul class="list-inline link-list"&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://www.linkedin.com/in/jonathandanylko" title="LinkedIn Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/linkedin_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://twitter.com/jdanylko" title="Twitter Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/twitter_16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li class="list-inline-item"&gt;&lt;a class="noImage" href="http://instagram.com/jdanylko" title="Instagram Profile"&gt;&lt;img src="https://www.danylkoweb.com/content/images/instagram-16.png" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jonathan "JD" Danylko is an author, web architect, and entrepreneur who's been programming for over 30 years. He's developed websites for small, medium, and Fortune 500 companies since 1996.&lt;/p&gt;
&lt;p&gt;He currently works at &lt;a href="https://www.danylkoweb.com/Blog/growing-up-with-insight-O4" title="Go to Growing up with Insight"&gt;Insight Enterprises&lt;/a&gt; as an Architect.&lt;/p&gt;
&lt;p&gt;When asked what he likes to do in his spare time, he replies, "I like to write and I like to code. I also like to write about code."&lt;/p&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Mon, 01 Jul 2024 00:00:00 -0700</pubDate></item></channel></rss>