<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rafael Rejuso, Author at DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/author/rafaelr/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Mon, 27 Jul 2026 14:22:43 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://static.dmcinfo.com/wp-content/uploads/2025/04/site-icon-150x150.png</url>
	<title>Rafael Rejuso, Author at DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Git as Fast as Possible: Reword and Squash</title>
		<link>https://static.dmcinfo.com/blog/19251/git-as-fast-as-possible-reword-and-squash/</link>
		
		<dc:creator><![CDATA[Rafael Rejuso]]></dc:creator>
		<pubDate>Thu, 01 Jul 2021 09:58:52 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/19251/git-as-fast-as-possible-reword-and-squash/</guid>

					<description><![CDATA[<p>Version control systems are the backbone of any good software development process, so it helps to be familiar with them. At DMC, we typically utilize GitLab and Subversion (SVN)—but occasionally, I’ve had to squash commits together to have a cleaner history. This guide provides a high-level overview of how to utilize the Git interactive rebase&#160;to [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/19251/git-as-fast-as-possible-reword-and-squash/">Git as Fast as Possible: Reword and Squash</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Version control systems are the backbone of any good software development process, so it helps to be familiar with them. At DMC, we typically utilize GitLab and Subversion (SVN)—but occasionally, I’ve had to squash commits together to have a cleaner history.</p>



<p class="wp-block-paragraph">This guide provides a high-level overview of how to utilize the <a href="https://git-scm.com/docs/git-rebase" target="_blank">Git interactive rebase</a>&nbsp;to squash and reword commit messages, without diving into the many intricacies of Git.</p>



<h2 id="h-what-i-m-using" class="wp-block-heading">What I’m Using:</h2>



<ul class="wp-block-list">
<li>Windows Command Prompt</li>
</ul>



<h2 id="h-scenario" class="wp-block-heading">Scenario:</h2>



<p class="wp-block-paragraph">We have a feature that we branched off&nbsp;our main feature branch with four commits ahead that we want to squash down into one commit. We also want this one to have a meaningful name so that we can see exactly what we did when we view the history.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-01.png" alt="Git squashing four commits into one "/></figure>



<p class="wp-block-paragraph"><em>Note: the branch is called squash-example</em></p>



<p class="wp-block-paragraph"><strong><em>Tip: If you make a mistake, typing in :u undoes the last change you did in Vi Improved (Vim</em></strong><strong><em>).</em></strong></p>



<h2 id="h-step-0-update-and-backup-optional" class="wp-block-heading">Step 0 – Update and Backup (Optional)</h2>



<p class="wp-block-paragraph">Make sure you have the latest versions of both branches by doing a <a href="https://git-scm.com/docs/git-fetch" target="_blank">git fetch</a> and <a href="https://git-scm.com/docs/git-pull" target="_blank">git pull</a>.</p>



<p class="wp-block-paragraph">If you aren’t comfortable with the Git interactive rebase yet, I suggest making a backup. You can do this by simply creating a new branch based on the one we want to squash. You can do this with <a href="https://git-scm.com/docs/git-checkout" target="_blank">git checkout</a> command in your command prompt as shown below:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">VB</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>.dmcinfo.com/wp-content/uploads/2025/05/27162644/Git-checkout-command-in-command-prompt.png" alt="Git checkout command in command prompt" /></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">.dmcinfo.</span><span style="color: #9CDCFE">com</span><span style="color: #D4D4D4">/</span><span style="color: #9CDCFE">wp</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">/</span><span style="color: #9CDCFE">uploads</span><span style="color: #D4D4D4">/</span><span style="color: #B5CEA8">2025</span><span style="color: #D4D4D4">/</span><span style="color: #B5CEA8">05</span><span style="color: #D4D4D4">/</span><span style="color: #B5CEA8">27162644</span><span style="color: #D4D4D4">/</span><span style="color: #9CDCFE">Git</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">checkout</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">command</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">in</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">command</span><span style="color: #D4D4D4">-prompt.png</span><span style="color: #CE9178">&quot; alt=&quot;</span><span style="color: #D4D4D4">Git checkout command in command prompt</span><span style="color: #CE9178">&quot; /&gt;</span></span></code></pre></div>



<h2 id="h-step-1-check-out-the-branch-you-want-to-squash" class="wp-block-heading">Step 1 – Check Out the Branch You Want to Squash</h2>



<p class="wp-block-paragraph">First, do a <a href="https://git-scm.com/docs/git-status" target="_blank">git status</a> to verify you are in the correct branch. We can then begin the interactive rebase process in two ways. First, we can specify the number of commits we want to rebase from our current state:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">VB</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>git rebase -i HEAD~&lt;x></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">git </span><span style="color: #9CDCFE">rebase</span><span style="color: #D4D4D4"> -</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> HEAD~&lt;</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">For our example, we’ll replace ~&lt;x&gt; with git rebase -i HEAD~5 to show us the last five commits.</p>



<p class="wp-block-paragraph">The second way is to specify the sha1: </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">VB</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>git rebase -i &lt;commit-sha1></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">git </span><span style="color: #9CDCFE">rebase</span><span style="color: #D4D4D4"> -</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #9CDCFE">commit</span><span style="color: #D4D4D4">-</span><span style="color: #9CDCFE">sha1</span><span style="color: #D4D4D4">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Doing so will display all the commits after the specified sha1. <commit-sha1><x></x></commit-sha1></p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/All-commits-after-specified-sha1.png" alt="All the commits after the specified sha1"/></figure>



<h2 id="h-step-2-rename-the-commit-we-want-to-keep" class="wp-block-heading">Step 2 – Rename the Commit We Want to Keep</h2>



<p class="wp-block-paragraph">First, press <strong>S</strong> to enter insert mode. Anything marked as &#8220;pick&#8221; will be kept as a commit in the history. In our case, we want to keep the very first item, which is the commit where we branched off from our master branch.</p>



<p class="wp-block-paragraph">In insert mode, replace <strong>pick</strong> with <strong>reword</strong> to mark the commit we want to rename.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-05.png" alt="Once marked, replace the name "/></figure>



<p class="wp-block-paragraph">Once that is marked, you will be brought to a follow-up edit screen to replace the name of the commit, which will be covered in Step 4. If your main goal is to rename a commit, you can skip to Step 4 now, otherwise, we’ll cover the command for squashing in the following step.</p>



<h2 id="h-step-3-select-the-commits-to-squash" class="wp-block-heading">Step 3 – Select the Commits to Squash</h2>



<p class="wp-block-paragraph">Like in text editors, you can highlight a chunk of text in Vim and replace them simultaneously.</p>



<p class="wp-block-paragraph">Hit <strong>ESC</strong> to exit insert mode, then press <strong>CTRL + SHIFT + V</strong> to enter visual block mode and highlight all the picks that we want to squash. Press C to confirm our selection.</p>



<p class="wp-block-paragraph">Type in <strong>squash</strong>&nbsp;then hit <strong>ESC</strong>,&nbsp;and it should replace all the picks to squash.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-Gif.gif" alt="Gif of highlighting text in Vim to squash"/></figure>



<h2 id="h-step-4-save-changes" class="wp-block-heading">Step 4 – Save Changes</h2>



<p class="wp-block-paragraph">You can hit <strong>ESC</strong> and enter <strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f621.png" alt="😡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></strong>&nbsp;to save and exit the editor. This should bring you to the rewrite commit message screen where you can edit it one last time:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-07.png" alt="The rewrite commit message screen where you can edit "/></figure>



<p class="wp-block-paragraph">Again, we can repeat <strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f621.png" alt="😡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></strong>&nbsp;to confirm the reword and save our rebase. If you’re only looking to rename a commit, then you can stop here. However, we can see that the editor is now telling us our next command is ‘squash’—which allows you to edit commit messages.</p>



<h2 id="h-step-5-squash-and-rewording-commit-messages" class="wp-block-heading">Step 5 – Squash and rewording commit messages</h2>



<p class="wp-block-paragraph">When we squash, we can change the overall commit message either by editing them or commenting them out. Once we edit it, we save it again with <strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f621.png" alt="😡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></strong></p>



<p class="wp-block-paragraph">In this first example, I do not comment out any commit messages:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-08.png" alt="Do not comment out any commit messages"/></figure>



<p class="wp-block-paragraph">The log looks something like this:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-09.png" alt="The log"/></figure>



<p class="wp-block-paragraph">On this screen, I comment out the other changes so they do not show up in the commit message:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-10.png" alt="Comment out the other changes so they do not show up in the commit message"/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-11.png" alt="Comment out the other changes so they do not show up in the commit message"/></figure>



<p class="wp-block-paragraph">After saving, you should see a message like this:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-12.png" alt="After saving, a message should look like this"/></figure>



<h2 id="h-step-6-force-push" class="wp-block-heading">Step 6 – Force Push</h2>



<p class="wp-block-paragraph">The last thing we want to do is run the command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">VB</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>git push --force</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">git </span><span style="color: #9CDCFE">push</span><span style="color: #D4D4D4"> --</span><span style="color: #9CDCFE">force</span></span></code></pre></div>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-13.png" alt="Run the command: git push --force"/></figure>



<p class="wp-block-paragraph">This pushes up our changes and overwrites the history in the remote repository.</p>



<h2 id="h-step-7-verify-that-everything-matches-up" class="wp-block-heading">Step 7 – Verify That Everything Matches Up.</h2>



<p class="wp-block-paragraph">We can again check git log&nbsp;and see that instead of four commits, we only have the one.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Git-Squashing-14.png" alt="Verify that everything matches up"/></figure>



<p class="wp-block-paragraph">That should cover the bare minimum as clearly and quickly as possible for squashing commits and applying a rewrite. Having a well-maintained and readable history allows for easier development down the line, so taking a few moments to make commits look clean is something you definitely want to do.</p>



<p class="wp-block-paragraph"><strong>Learn more about&nbsp;DMC&#8217;s <a href="https://static.dmcinfo.com/services/application-development">Application Development&nbsp;expertise</a> and <a href="https://static.dmcinfo.com/contact">contact us</a> for your next project.</strong></p>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/19251/git-as-fast-as-possible-reword-and-squash/">Git as Fast as Possible: Reword and Squash</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Easily Access SharePoint Content Using @pnp/sp</title>
		<link>https://static.dmcinfo.com/blog/19408/easily-access-sharepoint-content-using-pnp-sp/</link>
		
		<dc:creator><![CDATA[Rafael Rejuso]]></dc:creator>
		<pubDate>Wed, 24 Mar 2021 12:32:42 +0000</pubDate>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Sharepoint]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/19408/easily-access-sharepoint-content-using-pnp-sp/</guid>

					<description><![CDATA[<p>DMC has previously covered how to utilize SharePoint’s REST API for building workflows, creating list items and folders, and additional tips. In this blog, I’ll discuss an easy way to consume the SharePoint REST APIs using @pnp/sp in a typesafe way. I recently utilized @pnp/sp in a React SPFx web part over direct queries, which simplified [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/19408/easily-access-sharepoint-content-using-pnp-sp/">Easily Access SharePoint Content Using @pnp/sp</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">DMC has previously covered how to utilize SharePoint’s REST API for <a href="/latest-thinking/blog/id/8575/building-workflows-with-new-features-of-sharepoint-2013">building workflows</a>, creating<a href="/latest-thinking/blog/id/9832/creating-sharepoint-list-items-in-microsoft-flow-using-a-rest-api"> list items</a> and <a href="/latest-thinking/blog/id/10045/microsoft-flow-create-a-sharepoint-folder-when-a-list-item-is-created-using-a-rest-api">folders</a>, and <a href="/latest-thinking/blog/id/8927/sharepoint-rest-api-tips">additional tips</a>. In this blog, I’ll discuss an easy way to consume the SharePoint REST APIs using @pnp/sp in a typesafe way. I recently utilized @pnp/sp in a React SPFx web part over direct queries, which simplified much of the development and made my life a whole lot easier.</p>



<h2 class="wp-block-heading" id="h-what-is-pnp-sp">What is @pnp/sp?</h2>



<p class="wp-block-paragraph">@pnp is an open-source library that can be utilized in JavaScript, NodeJS, and SharePoint Framework projects to accomplish many things that we would need to write custom REST requests for. @pnp/sp pertains specifically to SharePoint and is one part of the @pnp collection.&nbsp;</p>



<h2 class="wp-block-heading" id="h-why-use-pnp-sp">Why Use @pnp/sp?</h2>



<p class="wp-block-paragraph">Using a library is advantageous because it abstracts the REST queries and puts them in readable, understandable code. We also get the benefits of type-checking as @pnp returns defined objects, as well as abstracting some of the nitty-gritty of REST Requests away.</p>



<p class="wp-block-paragraph">Simply put, @pnp/sp makes performing requests a lot easier and should be utilized if available. A major advantage of this library is that it also offers IntelliSense, a robust code-completion aid developed by Microsoft. This means we can quickly see many different properties and methods, as opposed to looking up every single command and object in the documentation.</p>



<p class="wp-block-paragraph">For example, VSCode IntelliSense allows for autocomplete in the image below.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/VSCode-IntelliSense-Screenshot.png" alt=""/></figure>



<p class="wp-block-paragraph">It also shows the annotated documentation for functions.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/VSCode-Annotated-Documentation-Screenshot.png" alt=""/></figure>



<h4 class="wp-block-heading" id="h-examples-and-use-cases"><strong><u>Examples and Use Cases</u></strong></h4>



<h2 class="wp-block-heading" id="h-1-retrieving-a-list-of-site-users-from-sharepoint">1. Retrieving a List of Site Users From SharePoint</h2>



<p class="wp-block-paragraph">Let’s say we need to retrieve a list of all users for a given SharePoint site. We can utilize the @pnp/sp/webs in conjunction with @pnp/sp/site-users to retrieve a list of siteUsers for a given site:</p>


<pre class="”brush:xml”">
const users = await web.siteUsers();

const usersFiltered = await web.siteUsers.filter(`startswith(LoginName, &apos;${encodeURIComponent(&quot;i:0#.f|m&quot;)}&apos;)`)();

</pre>


<h2 class="wp-block-heading" id="h-2-getting-the-current-user-s-groups">2. Getting the Current User&#8217;s Groups</h2>



<p class="wp-block-paragraph">We can use @pnp/sp/site-groups to easily find, delete, update, or even add a site group to a user. In this example, we’ll retrieve a list of groups the current user belongs to.</p>



<p class="wp-block-paragraph">As we can see in the IntelliSense, it provides us with some properties of each group, such as ID or description, which we can then use for our code.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/VSCode-IntelliSense-Properties-Screenshot.png" alt=""/></figure>



<h2 class="wp-block-heading" id="h-3-adding-a-file-to-a-folder-in-sharepoint">3. Adding a File to a Folder in SharePoint</h2>



<p class="wp-block-paragraph">If we need to add files, we can do so by first using a combination of @pnp/sp/folders to navigate to the folder we want to use. Once we’ve found the correct folder, we can simply use @pnp/sp/files to add the files.</p>


<pre class="”brush:xml”">
const result = await web
                    .getFolderByServerRelativeUrl(&quot;https://myExample.sharepoint.come/myFiles&quot;)
                    .files.add(&quot;MyNewFile.txt&quot;, file, false);
                return result;
</pre>


<p class="wp-block-paragraph">These are three basic examples of some common use cases&nbsp;in development. However, there are plenty of other libraries in @pnp/sp that can achieve many things that we would otherwise have to create our own queries for. @pnp/sp is a great resource with a wide variety of functionalities offered to SharePoint Framework developers. I suggest visiting their <a href="https://pnp.github.io/pnpjs/" target="_blank" rel="noreferrer noopener">documentation</a> for more examples and uses of this library.</p>



<p class="wp-block-paragraph"><strong>Learn more about DMC’s <a href="/services/digital-workplace-solutions/microsoft-consulting-services/sharepoint">SharePoint expertise</a> and <a href="/contact">contact us</a> to get started on your next project. </strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/19408/easily-access-sharepoint-content-using-pnp-sp/">Easily Access SharePoint Content Using @pnp/sp</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>6 Tips for Working with Legacy Code That You Did Not Write</title>
		<link>https://static.dmcinfo.com/blog/19746/6-tips-for-working-with-legacy-code-that-you-did-not-write/</link>
		
		<dc:creator><![CDATA[Rafael Rejuso]]></dc:creator>
		<pubDate>Tue, 08 Sep 2020 12:09:30 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[PC Application Development]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<category><![CDATA[Legacy Code]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/19746/6-tips-for-working-with-legacy-code-that-you-did-not-write/</guid>

					<description><![CDATA[<p>There may come a time as a programmer that you have to support a crucial existing system and while the task is daunting, there are still many actions you can take to make that process a lot easier. When you have to work with a deep expansive legacy system it&#8217;s easy to get lost in [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/19746/6-tips-for-working-with-legacy-code-that-you-did-not-write/">6 Tips for Working with Legacy Code That You Did Not Write</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">There may come a time as a programmer that you have to support a crucial existing system and while the task is daunting, there are still many actions you can take to make that process a lot easier. When you have to work with a deep expansive legacy system it&rsquo;s easy to get lost in a lot of the details. Here are six tips that definitely would&rsquo;ve saved me, and hopefully you, some time when getting introduced to a legacy system&nbsp;regardless of web or desktop.</p>

<h2 class="wp-block-heading">1. Ask as Many Questions as Possible</h2>

<p class="wp-block-paragraph">One of the fastest ways of getting familiarized with legacy code is to simply ask a lot of questions from the previous developer if that is possible. Starting off, it might not be possible to know of all the specific questions someone may have about the code. Ideally, you should try to ask questions about the overall structure and algorithm of the program. This helps create a more defined mental map and allows you to quickly identify places to edit/change in the event you need to implement new features.</p>

<p class="wp-block-paragraph">It is also valuable to ask about previous places the developer had difficulty in or code they believe is not as robust. There is no reason to try and resolve an issue twice if the previous developer already identified the problem. Simply keeping this information in the back of your mind whenever you write a new code that interacts with that section can help to debug smoother. However, not everyone can have the luxury of having the previous developer available, in which case you can try your luck with the client or userbase actively using the code for any history they may remember, in regards to bugs or already implemented fixes.</p>

<p class="wp-block-paragraph">If either way is not possible, there are still many things you can do to make working with legacy code a lot less painful, which I will cover in the following tips.</p>

<h2 class="wp-block-heading">2. Document Call Hierarchy</h2>

<p class="wp-block-paragraph">When working with a large spanning piece of code, it can get difficult tracing down how a function or procedure works, especially when you have to make edits that may have far extending effects that you need to account for. You can create a simple call hierarchy by noting down the specific function you call, and all the subsequent calls that function makes in sequential order.</p>

<p class="wp-block-paragraph">For instance, if you have a function <em>Run </em>which calls function <em>GetItems </em>and later on <em>SortItems</em>, you can keep track of the process and all the necessary places you have to change the code to maintain functionality. This is especially true if there are further calls in the subfunctions such as <em>GetItems </em>calling its own subfunction of <em>LoadFile</em>. This process of documenting the hierarchy should be kept relatively simple and easy to read, something as simple as the name of the function should work.</p>

<ul class="wp-block-list">
 <li>Run
 <ul class="wp-block-list" style="list-style-type:circle;">
  <li>GetItems
  <ul class="wp-block-list">
   <li>LoadFile</li>
  </ul>
  </li>
  <li>SortItems</li>
 </ul>
 </li>
 <li>&hellip;</li>
</ul>

<p class="wp-block-paragraph">A key point is that you should not go in-depth as to what each function does, especially if you are looking at the code for the first time. The main reason you want to avoid that is that by documenting excessively, you might develop biases or assumptions that are initially inaccurate.</p>

<p class="wp-block-paragraph">After working with the legacy code, you&rsquo;ll discover nuances and small details that you may have overlooked in the first pass through that change how the process runs, like a flag being set on a variable or specific timings that may have been missed.</p>

<p class="wp-block-paragraph">Keeping the documentation of hierarchy simple will allow you to identify and understand the structure, but allow you to avoid common pitfalls and red herrings that comes from not being unacquainted with the code. As you get familiarized with the code, you can develop more diagrams and discover how your new or edited code interacts with the rest of the system.</p>

<h2 class="wp-block-heading">3. Double Check Your Assumptions</h2>

<p class="wp-block-paragraph">A subsequent tip that was briefly touched on is that you may develop assumptions after going through the first pass of the code. When bugs occur, one of the first things you should immediately look at when you have reached a dead-end is to re-check your initial assumptions. In most cases, a lot of bugs that come from editing legacy code comes from a misunderstanding over what you believe something does, and what it actually does. After reviewing changes that you implemented and making sure it works, the next step should always be to double-check assumptions that you previously made.</p>

<p class="wp-block-paragraph">For example, this can occur in conditional statements, where you believe the code would go into a specific conditional branch but instead goes somewhere else entirely. Another place this can occur is in function calls that have side effects that might have been missed, setting flags in other places of the code.</p>

<figure class="wp-block-image"><img decoding="async" alt="" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/CRT-Monitor-with-code.png" /></figure>

<h2 class="wp-block-heading">4. Testing, Testing, Testing</h2>

<p class="wp-block-paragraph">This might be obvious, but after you make any changes, extensive testing should be done to guarantee not only that the new function works, but that everything else behaves as it did before the changes. Setting up unit testing and functional testing ahead of time can go a long way in saving time and effort by having a set of pre-defined test suites to verify that everything is working in tip-top shape.</p>

<p class="wp-block-paragraph">In cases where the code is too old and setting up testing cases do not make sense, setting up logging in as many places as possible can be key in debugging potential issues. Debugging and viewing the watch screen is very viable. Having logging sequences in place for each event is just as valuable as an issue could occur and you aren&apos;t around to watch it happen, logging will help narrow down <span style="font-size: calc(var(--rem) * 1px * 1.0625); letter-spacing: 0px;">exactly where the issue occurred, and some valuable replicable context that can help track down the issue.</span></p>

<p class="wp-block-paragraph"><span style="font-size: calc(var(--rem) * 1px * 1.0625); letter-spacing: 0px;">For each new addition, there should be at the very least, a new line of logging or monitoring that should stay until it has been verified that the program is running consistently.</span></p>

<h2 class="wp-block-heading">5. Start Small and Go Slow</h2>

<p class="wp-block-paragraph">Starting small goes hand in hand with testing everything. Sometimes, a change doesn&rsquo;t require knowing every single nook and cranny of a large piece of code. In other cases, it requires changing code in many different places that you may not have been identified yet. It can get overwhelming changing code in multiple places and remembering to do it all.</p>

<p class="wp-block-paragraph">Making sure to go slow and looking at one section of code at a time can reduce a lot of mistakes. This isn&rsquo;t just applicable to legacy code but can also be applied to most aspects of coding.</p>

<h2 class="wp-block-heading">6. Document Everything</h2>

<p class="wp-block-paragraph">Lastly, you want to document everything. From the discoveries you&rsquo;ve made at looking at the legacy code, to the new additions that you&rsquo;ve added. This can as simple as notes that you can print out, or comments in the code itself. Documentation not only helps you but also helps future developers that may have to work on this software. This information will create stability for yourself when months down the line, you may have to go back and look at your own work. By setting it in a sort of electronic stone, it legitimizes the changes done to the project, beyond just being key points to remember internally.</p>
<p>The post <a href="https://static.dmcinfo.com/blog/19746/6-tips-for-working-with-legacy-code-that-you-did-not-write/">6 Tips for Working with Legacy Code That You Did Not Write</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sorting Multiple Columns in a Table with React</title>
		<link>https://static.dmcinfo.com/blog/19887/sorting-multiple-columns-in-a-table-with-react/</link>
		
		<dc:creator><![CDATA[Rafael Rejuso]]></dc:creator>
		<pubDate>Tue, 02 Jun 2020 14:08:49 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[PC Application Development]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<category><![CDATA[How To]]></category>
		<category><![CDATA[React]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/19887/sorting-multiple-columns-in-a-table-with-react/</guid>

					<description><![CDATA[<p>Tables are a fast way to show a lot of valuable data. There are many guides on sorting tables by a column in React, but sorting multiple columns is something that can take some effort. At the end of this guide, you should have a sortable table where you can click multiple columns. For this [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/19887/sorting-multiple-columns-in-a-table-with-react/">Sorting Multiple Columns in a Table with React</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Tables are a fast way to show a lot of valuable data. There are many guides on sorting tables by a column in React, but sorting multiple columns is something that can take some effort. At the end of this guide, you should have a sortable table where you can click multiple columns.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/sorting-mulitple-columns-react.gif" alt="Sorting mulitple columns with React"/></figure>



<p class="wp-block-paragraph">For this tutorial, we will be leveraging the use of LINQ&nbsp;to make sorting quite painless, and optionally Material-UI for styling the table. At the very end, I will also briefly describe a way of implementing this table without using LINQ&nbsp;and only using base React.</p>



<h2 class="wp-block-heading" id="h-tools-used-in-this-blog">Tools Used in this Blog:</h2>



<ul class="wp-block-list">
<li>LINQ&nbsp;</li>



<li><a href="https://static.dmcinfo.com/latest-thinking/blog/id/10114/a-simple-guide-to-material-ui-grids">Material-UI </a><em>(Optional)</em></li>



<li>Basic React hooks</li>



<li>Functional React</li>
</ul>



<h2 class="wp-block-heading" id="h-setup">Setup</h2>



<p class="wp-block-paragraph">First, we need some data.&nbsp;For the purposes of this example, I just created some dummy data that we can sort. I also defined an interface for the data type and an enum for departments that a person can belong to.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> const dataList=&#91;
    {name: 'Ryan H.',   hours: 30, startDate: new Date('2019-01-14'), department: Department.Marketing},
    {name: 'Ariel P.',  hours: 22, startDate: new Date('2017-03-12'), department: Department.Sales},
    {name: 'Ryan Y.',   hours: 31, startDate: new Date('2015-09-12'), department: Department.Marketing},
    {name: 'Ed T.',     hours: 22, startDate: new Date('2017-03-12'), department: Department.Engineering},
    {name: 'Matt G.',   hours: 30, startDate: new Date('2017-03-12'), department: Department.Marketing},
    {name: 'Olivia H.', hours: 32, startDate: new Date('2018-05-10'), department: Department.Engineering}&#93; as TableData[];</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">dataList</span><span style="color: #D4D4D4">=&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Ryan H.&apos;</span><span style="color: #D4D4D4">,   </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">30</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2019-01-14&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Marketing</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Ariel P.&apos;</span><span style="color: #D4D4D4">,  </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">22</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2017-03-12&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Sales</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Ryan Y.&apos;</span><span style="color: #D4D4D4">,   </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">31</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2015-09-12&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Marketing</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Ed T.&apos;</span><span style="color: #D4D4D4">,     </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">22</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2017-03-12&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Engineering</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Matt G.&apos;</span><span style="color: #D4D4D4">,   </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">30</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2017-03-12&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Marketing</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Olivia H.&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">hours:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">startDate:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Date</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;2018-05-10&apos;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">department:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Engineering</span><span style="color: #D4D4D4">}&#93; </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">[];</span></span></code></pre></div>



<p class="wp-block-paragraph">Our interface is <strong>TableData.</strong>&nbsp;We have an enum called <strong>Departments</strong> which lists the available department&#8217;s people may be in:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>interface TableData{
    name: String,
    hours: number,
    startDate: Date,
    department: Department
}

enum Department{
    Marketing = 'Marketing',
    Sales = 'Sales',
    Engineering = 'Engineering',
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hours</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">startDate</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Date</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">department</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Department</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">enum</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Department</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">Marketing</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&apos;Marketing&apos;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">Sales</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&apos;Sales&apos;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">Engineering</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&apos;Engineering&apos;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">It’s important to note that this interface and enum is solely for structuring our table, and not for sorting. We will eventually add another interface and enum for sorting.</p>



<p class="wp-block-paragraph">For the case of simulation, I’ll be placing the data into another file and returning it from a function call called <strong>fetchData.</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>export const fetchData = () => { return dataList;}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">fetchData</span><span style="color: #D4D4D4"> = () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> { </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">;}</span></span></code></pre></div>



<p class="wp-block-paragraph">For the table, we’ll be using Material-UI, but this method will absolutely work with just a regular table. If you don’t want to use Material-UI tables, just replace the tags with the corresponding ones below. Everything but TableBody has a corresponding tag which just contains a collection of &lt;tr&gt; tags.</p>


<table style="width:100%; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; margin-bottom:40px;">
<tbody>
<tr style="text-align:center;">
<th style="border-collapse:collapse; border-style:solid; border-width:medium; border-spacing: 20px; border:1px solid black; height:100px; font-size:24px; border-right-style:solid; border-right-width:medium; border-left-style:solid; border-left-width:medium;">MaterialUI</th>
<th style="border-collapse:collapse; border-style:solid; border-width:medium; border-spacing: 20px; border:1px solid black; height:100px; font-size:24px; border-right-style:solid; border-right-width:medium; border-left-style:solid; border-left-width:medium;">HTML</th>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">TableHead</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">th</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">TableBody</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">&#8211;</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">TableRow</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">tr</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">TableCell</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">td</td>
</tr>
</tbody>
</table>


<p class="wp-block-paragraph">Now we pull our data from the other file by calling <strong>fetchData</strong>, set up the appropriate table headers, and map our data to the corresponding table cells. For the sake of keeping clean code, I moved the sortable table headers to another component, so our code should look somewhat like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import React from "react";
import {Table, TableRow, TableCell, TableBody } from '@material-ui/core';
import { fetchData, TableData } from "./fetchData";
import { SortableHeader } from "./sortableTableHeader";

export const TableExample = () => {
    const dataList = fetchData();
    return(
        &lt;div>
            &lt;Table>
                &lt;SortableHeader/>
                &lt;TableBody>
                    {dataList.map((data) => { return(
                        &lt;TableRow>
                            &lt;TableCell>
                                {data.name}
                            &lt;/TableCell>
                            &lt;TableCell>
                                {data.hours}
                            &lt;/TableCell>
                            &lt;TableCell>
                                {data.startDate.toDateString()}
                            &lt;/TableCell>
                            &lt;TableCell>
                                {data.department}
                            &lt;/TableCell>
                        &lt;/TableRow>
                        )})}
                &lt;/TableBody>
            &lt;/Table>
        &lt;/div>
    )
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">React</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;react&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> {</span><span style="color: #9CDCFE">Table</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableBody</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;@material-ui/core&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">fetchData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableData</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;./fetchData&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">SortableHeader</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;./sortableTableHeader&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">TableExample</span><span style="color: #D4D4D4"> = () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">dataList</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">fetchData</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #4EC9B0">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;</span><span style="color: #4EC9B0">Table</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #9CDCFE">SortableHeader</span><span style="color: #D4D4D4">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableBody</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                    {</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">map</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">) =&gt; { </span><span style="color: #DCDCAA">return</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">hours</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">startDate</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">toDateString</span><span style="color: #D4D4D4">()}</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">department</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;/</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                        )})}</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;/</span><span style="color: #9CDCFE">TableBody</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/</span><span style="color: #9CDCFE">Table</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import React from "react";
import { TableHead, TableRow, TableCell } from "@material-ui/core";

export const SortableHeader = () => {
    return (
        &lt;TableHead>
            &lt;TableRow>
                &lt;TableCell>Name&lt;/TableCell>
                &lt;TableCell>Hours&lt;/TableCell>
                &lt;TableCell>Date&lt;/TableCell>
                &lt;TableCell>Department&lt;/TableCell>
            &lt;/TableRow>
        &lt;/TableHead>
    );
};</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">React</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;react&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">TableHead</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4"> } </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;@material-ui/core&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SortableHeader</span><span style="color: #D4D4D4"> = () </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #4EC9B0">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;</span><span style="color: #4EC9B0">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Name</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Hours</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Date</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<p class="wp-block-paragraph">Which outputs something like this:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/1-react-tables-bad.png" alt=""/></figure>



<h2 class="wp-block-heading" id="h-implementation">Implementation</h2>



<p class="wp-block-paragraph">Our overall goal is to create an ordered queue of sorting configurations that will apply each sorting in order through the use of LINQ&nbsp;to our data. We will then update our data list which will be re-rendered and displayed in the desired sorting configuration.</p>



<p class="wp-block-paragraph"><p style="font-size:110%"><strong>Step 1: Define a Sorting configuration</strong></p></p>



<p class="wp-block-paragraph">A sorting configuration is essentially an object that has two things. The property/column of the list that we’re trying to sort, and the sorting type such as ascending or descending. Since our rows are all the same object type: TableData, we can use keyof TableData to get all the properties/columns of our table. The only thing we’d have to do is make an enum of the different sorting types that we need, in this case we’ll stick with the standard ascending/descending.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>interface SortingConfiguration{
    propertyName: keyof TableData,
    sortType: SortingType,
}

enum SortingType{
    Ascending,
    Descending,</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">SortingType</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">enum</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SortingType</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">Ascending</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4FC1FF">Descending</span><span style="color: #D4D4D4">,</span></span></code></pre></div>



<p class="wp-block-paragraph"><p style="font-size:110%"><strong>Step 2: Utilize useState to Maintain a List of our Sorting Configurations</strong></p></p>



<p class="wp-block-paragraph">If you’ve never used <strong>useState</strong>, it’s a React hook that returns an array of two things: the first being the state of an object that is being maintained. The second is basically a function/dispatch that you can call to change the state. Here we’re initializing our list of sorting configurations to be an empty list since we want to start off with an unsorted table.</p>



<p class="wp-block-paragraph">Note: If you do want a table column to be sorted by default, all you would need to do is add a <strong>SortConfiguration </strong>object in between the square brackets</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>  const &#91;sortConfig, updateSortConfig&#93; = useState&lt;SortingConfiguration[]>([]);
    //Below is an example of sorting columns by name by default.
    const &#91;initializedSortConfig, updateInitSortConfig&#93; = useState&lt;SortingConfiguration[]>(&#91;
        {propertyName: 'name', sortConfig: SortingType.Descending}
    &#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #4FC1FF">sortConfig</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">updateSortConfig</span><span style="color: #D4D4D4">&#93; = </span><span style="color: #DCDCAA">useState</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">[]&gt;([]);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">//Below is an example of sorting columns by name by default.</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #4FC1FF">initializedSortConfig</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">updateInitSortConfig</span><span style="color: #D4D4D4">&#93; = </span><span style="color: #DCDCAA">useState</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">[]&gt;(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortConfig:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;);</span></span></code></pre></div>



<p class="wp-block-paragraph"><p style="font-size:110%"><strong>Step 3: Create a Function That Adds, Modifies, and Removes Our Sorting Configurations</strong></p></p>



<p class="wp-block-paragraph">Most sortable headers are clickable headers that switch between a cycle of unsorted -&gt; descending -&gt; ascending -&gt; unsorted -&gt; etc, but there are many different orders or ways in which you may wish to set this up. You should be able to create your own custom function that edits the sorting configuration given three basic criteria:</p>



<ol class="wp-block-list">
<li>Add a sorting configuration to a column when there is not an existing configuration</li>



<li>Modify a sorting configuration when there is an existing configuration
 
 
<ul class="wp-block-list">
<li>For example, going from descending to ascending, or vice versa</li>
</ul>
</li>



<li>Provide a way to remove a sorting configuration
 
 
<ul class="wp-block-list">
<li>This can be a part of criteria #2, but it is important enough to warrant its own criteria</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">We’ll be following a cycle of unsorted -&gt; descending -&gt; ascending -&gt; unsorted -&gt; etc… for the purposes of this guide.</p>



<p class="wp-block-paragraph">We will be making a function called sortBy that will take in a key of TableData. Basically, whenever we call sortBy on a given property/column, it should automatically fulfill our three criteria: add a new configuration when we don’t have one, alter a configuration if we do, and remove a configuration when we need to. We wrap it in a <strong>useCallback </strong>because, in the next step, we will pass this function down to a prop.</p>



<p class="wp-block-paragraph">So our basic structure looks like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> const sortBy = useCallback(
        (propertyName: keyof TableData) => {
            let pendingChange = &#91;...sortConfig&#93;;
            const index = pendingChange.findIndex((config) => 
       						config.propertyName === 	propertyName)
            if(index > -1){
                // Existing configuration
            } else {
                // No existing configuration
            }
            updateSortConfig(&#91;...pendingChange&#93;);
        },
        &#91;sortConfig&#93;
    )</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">sortBy</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">useCallback</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        (</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;...</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">index</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">findIndex</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">       						</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4"> === 	</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4"> &gt; -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">// Existing configuration</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">// No existing configuration</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">updateSortConfig</span><span style="color: #D4D4D4">(&#91;...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        &#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span></code></pre></div>



<p class="wp-block-paragraph">We use the spread operator to make a copy of the <strong>sortConfiguration</strong>. Then we use <strong>findIndex </strong>to search our copied list and see if there is an existing configuration that’s in our list. We’ll be using a lot of the spread operator, so if you aren’t experienced with using it, you can see more examples in <a href="https://static.dmcinfo.com/latest-thinking/blog/id/9668/categoryid/95/5-great-uses-of-the-spread-operator-in-a-react-app">this blog by Jacob Bruce</a>. Now that we have the basic structure laid out, let’s address the first criteria. This one is relatively simple since all we’re doing is adding a sorting configuration given the propertyName that was passed in:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>  if(index > -1){
                // Existing configuration
            } else {
                pendingChange = &#91;
                    ...pendingChange,
                    { propertyName: propertyName, sortType: SortingType.Descending },
                &#93;;
            }</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4"> &gt; -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">// Existing configuration</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                    ...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                    { </span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortType:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4"> },</span></span>
<span class="line"><span style="color: #D4D4D4">                &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span></code></pre></div>



<p class="wp-block-paragraph">Here we use the spread operator to push a new sorting configuration to the end of the queue.</p>



<p class="wp-block-paragraph">Now we have to handle our second and third criteria which you can only do on an existing configuration. We can remove extra code if instead of modifying we save the existing sort direction, remove the current configuration and lastly, add in a new configuration if it’s necessary to ‘modify’. Technically, our modification is removing a configuration of a property and adding in the same property back, but with a different sortType, but doing it this way makes it so we don’t have to write two similar code branches.</p>



<p class="wp-block-paragraph">In short, we use our index we found to store the existing sort type. We then remove that configuration using splice. Lastly, we use our saved sorting type to determine if we needed to add a new configuration. In this example, we check if it’s Descending, and if that’s the case, we change that sortType to Ascending. Note how, if the sorting type is Ascending, we do not ‘modify’ our sorting configuration list, but rather just let the code remove the configuration.</p>



<p class="wp-block-paragraph">Put together we have:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> const sortBy = useCallback(
        (propertyName: keyof TableData) => {
            let pendingChange = &#91;...sortConfig&#93;;
            const index = pendingChange.findIndex((config) => 
                                    config.propertyName === propertyName)
            if(index > -1){
                //Save the sortType
                var currentSortType = pendingChange&#91;index&#93;.sortType;
                //Remove existing config
                pendingChange.splice(index, 1);
                //check if the sort type we saved is descending
                if (currentSortType === SortingType.Descending) {
                    pendingChange = &#91;
                        ...pendingChange,
                        { propertyName: propertyName, sortType: SortingType.Ascending },
                    &#93;;
                }
            } else {
                pendingChange = &#91;
                    ...pendingChange,
                    { propertyName: propertyName, sortType: SortingType.Descending },
                &#93;;
            }
            updateSortConfig(&#91;...pendingChange&#93;);
        },
        &#91;sortConfig&#93;
    )</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">sortBy</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">useCallback</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        (</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;...</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">index</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">findIndex</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">                                    </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4"> &gt; -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Save the sortType</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">currentSortType</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Remove existing config</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">splice</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//check if the sort type we saved is descending</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">currentSortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                        ...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                        { </span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortType:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4"> },</span></span>
<span class="line"><span style="color: #D4D4D4">                    &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                    ...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                    { </span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortType:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4"> },</span></span>
<span class="line"><span style="color: #D4D4D4">                &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">updateSortConfig</span><span style="color: #D4D4D4">(&#91;...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        &#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span></code></pre></div>



<p class="wp-block-paragraph">Now the loop of unsorted -&gt; descending -&gt; ascending -&gt; unsorted -&gt; etc… is complete.</p>



<p class="wp-block-paragraph"><p style="font-size:110%"><strong>Step 4: Attach Our Function to the Table Headers</strong></p></p>



<p class="wp-block-paragraph">Now that we created our function, we need to attach it to table headers and make them something we can click. Since we’re passing down our props to our <strong>SortableTableHeader </strong>don’t forget to export our interfaces and enums to avoid errors. We’ll need to pass two things to our SortableTableHeader the first is our newly created sortBy function, and the second is our current <strong>sortConfig </strong>which will be used for arrow indicators to show what direction we’re sorting.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;Table>
    &lt;SortableHeader 
          sortBy={sortBy} 
          sortConfig={sortConfig}
          />
      &lt;TableBody>
		………
&lt;/Table>
&lt;/TableBody>
&lt;/pre>

&lt;pre class="brush:js">
interface SortableHeaderProps{
    sortBy: (string: keyof TableData) => void;
    sortConfig: SortingConfiguration[];
}

export const SortableHeader = ({sortBy, sortConfig}:SortableHeaderProps) => {
    return (
        &lt;TableHead>
            &lt;TableRow>
                &lt;TableCell>Name&lt;/TableCell>
                &lt;TableCell>Hours&lt;/TableCell>
                &lt;TableCell>Date&lt;/TableCell>
                &lt;TableCell>Department&lt;/TableCell>
            &lt;/TableRow>
        &lt;/TableHead>
    );
};</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">Table</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;</span><span style="color: #9CDCFE">SortableHeader</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">sortBy</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">sortBy</span><span style="color: #D4D4D4">} </span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">          /&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;</span><span style="color: #4EC9B0">TableBody</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">		………</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">Table</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableBody</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">pre</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">&lt;</span><span style="color: #9CDCFE">pre</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;brush:js&quot;</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SortableHeaderProps</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">: (</span><span style="color: #9CDCFE">string</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">void</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">[];</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SortableHeader</span><span style="color: #D4D4D4"> = ({</span><span style="color: #9CDCFE">sortBy</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">}:</span><span style="color: #4EC9B0">SortableHeaderProps</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #4EC9B0">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;</span><span style="color: #4EC9B0">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Name</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Hours</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Date</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #4EC9B0">TableCell</span><span style="color: #D4D4D4">&gt;</span><span style="color: #9CDCFE">Department</span><span style="color: #D4D4D4">&lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<p class="wp-block-paragraph">To keep code DRY, I’ll be making a list of the columns that we want, and the TableData property they correspond to. This way, we can map over the function without copy/pasting TableCell four times.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>const tableColumn = &#91;
        {label:'Name', property:'name'},
        {label:'Hours', property:'hours'},
        {label:'Date', property:'startDate'},
        {label:'Department', property:'department'}
        &#93; as TableColumn[];</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">tableColumn</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Name&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Hours&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;hours&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Date&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;startDate&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Department&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;department&apos;</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93; </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableColumn</span><span style="color: #D4D4D4">[];</span></span></code></pre></div>



<p class="wp-block-paragraph">Now, we can attach our function to the tablecell by adding the onClick prop to the <strong>TableCell</strong>, and pass in the corresponding property for the column being mapped. We can also apply our CSS stylings to the table cells at this point. Here I use Material UI’s styling solution, but the key point when doing this is setting the CSS property <em>cursor: ‘pointer’</em>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> &lt;TableHead>
            &lt;TableRow>
                {tableColumn.map((column, index) => {
                    return(
                        &lt;TableCell key={index} 
                            className={headerCell}
                            onClick={()=>sortBy(column.property)}
                        >
                            {column.label}
                        &lt;/TableCell>
                    )
                })}
            &lt;/TableRow>
        &lt;/TableHead></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> &lt;</span><span style="color: #4EC9B0">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;</span><span style="color: #4EC9B0">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                {</span><span style="color: #9CDCFE">tableColumn</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">map</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">} </span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">headerCell</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #9CDCFE">onClick</span><span style="color: #D4D4D4">={()=&gt;</span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">(column.property)}</span></span>
<span class="line"><span style="color: #D4D4D4">                        &gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            {</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">label</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                    )</span></span>
<span class="line"><span style="color: #D4D4D4">                })}</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">TableHead</span><span style="color: #D4D4D4">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Lastly, we’ll add an indicator arrow through conditional rendering to show the current sort direction. To do this, we have two conditionals to check what we render. The first is checking if there is an existing sorting configuration, and the second is checking if the sortType is ascending/descending. To make this easier, we can write a simple function that gets us the current sortType from the sorting configuration and returns an appropriate icon.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> const getSortDirection = (property:keyof TableData) => {
        var config = sortConfig.find((sortConfig) => sortConfig.propertyName === property)
        if(config){
            if(config.sortType === SortingType.Descending){
                return &lt;ArrowDownwardIcon/>
            }
            else {
                return &lt;ArrowUpwardIcon/>
            }
        }
        return null;
    }</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getSortDirection</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">:</span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">find</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #4EC9B0">ArrowDownwardIcon</span><span style="color: #D4D4D4">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            else {</span></span>
<span class="line"><span style="color: #D4D4D4">                return &lt;</span><span style="color: #4EC9B0">ArrowUpwardIcon</span><span style="color: #D4D4D4">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        return null;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span></code></pre></div>



<p class="wp-block-paragraph">Our <strong>SortableTableHeader </strong>code should now look like this, with the appropriate CSS stylings applied in place of <strong>headerCell </strong>and <strong>sortLabel</strong>, if you aren’t using Material-UI.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>export const SortableHeader = ({sortBy, sortConfig}:SortableHeaderProps) => {

    const {headerCell, sortLabel} = useStyles();

    const tableColumn = &#91;
        {label:'Name', property:'name'},
        {label:'Hours', property:'hours'},
        {label:'Date', property:'startDate'},
        {label:'Department', property:'department'}
        &#93; as TableColumn[];

    const getSortDirection = (property:keyof TableData) => {
        var config = sortConfig.find((sortConfig) => sortConfig.propertyName === property)
        return config ?
            config.sortType === SortingType.Descending ?
                &lt;ArrowDownwardIcon/>
                :&lt;ArrowUpwardIcon/>
            :null
    }

    return (
        &lt;TableHead>
            &lt;TableRow>
                {tableColumn.map((column, index) => {
                    return(
                        &lt;TableCell key={index} 
                            className={headerCell}
                            onClick={()=>sortBy(column.property)}
                        >
                            &lt;span className={sortLabel}>
                                {column.label}
                                {getSortDirection(column.property)}
                            &lt;/span>
                        &lt;/TableCell>
                    )
                })}
            &lt;/TableRow>
        &lt;/TableHead>
    );
};</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SortableHeader</span><span style="color: #D4D4D4"> = ({</span><span style="color: #9CDCFE">sortBy</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">}:</span><span style="color: #4EC9B0">SortableHeaderProps</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> {</span><span style="color: #4FC1FF">headerCell</span><span style="color: #D4D4D4">, </span><span style="color: #4FC1FF">sortLabel</span><span style="color: #D4D4D4">} = </span><span style="color: #DCDCAA">useStyles</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">tableColumn</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Name&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Hours&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;hours&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Date&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;startDate&apos;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span><span style="color: #9CDCFE">label:</span><span style="color: #CE9178">&apos;Department&apos;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">property:</span><span style="color: #CE9178">&apos;department&apos;</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93; </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableColumn</span><span style="color: #D4D4D4">[];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getSortDirection</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">:</span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">find</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4"> ?</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4"> ?</span></span>
<span class="line"><span style="color: #D4D4D4">                &lt;</span><span style="color: #9CDCFE">ArrowDownwardIcon</span><span style="color: #D4D4D4">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                :&lt;</span><span style="color: #4EC9B0">ArrowUpwardIcon</span><span style="color: #D4D4D4">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            :</span><span style="color: #569CD6">null</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #4EC9B0">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;</span><span style="color: #4EC9B0">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                {</span><span style="color: #9CDCFE">tableColumn</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">map</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">) =&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #DCDCAA">return</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">} </span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">headerCell</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #9CDCFE">onClick</span><span style="color: #D4D4D4">={()=&gt;</span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">(column.property)}</span></span>
<span class="line"><span style="color: #D4D4D4">                        &gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;</span><span style="color: #9CDCFE">span</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">sortLabel</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">label</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">                                {</span><span style="color: #9CDCFE">getSortDirection</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">property</span><span style="color: #D4D4D4">)}</span></span>
<span class="line"><span style="color: #D4D4D4">                            &lt;/</span><span style="color: #9CDCFE">span</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                        &lt;/</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                    )</span></span>
<span class="line"><span style="color: #D4D4D4">                })}</span></span>
<span class="line"><span style="color: #D4D4D4">            &lt;/</span><span style="color: #9CDCFE">TableRow</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">TableHead</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span></code></pre></div>



<p class="wp-block-paragraph">If everything went correctly, you should now see table headers with arrows showing the corresponding sort directions on them.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/2-react-tables-good.png" alt=""/></figure>



<p class="wp-block-paragraph"><p style="font-size:110%"><strong>Step 5: Applying the Sort Configuration with LINQ</strong></p></p>



<p class="wp-block-paragraph">The last step is to finally apply the sorting in order.</p>



<p class="wp-block-paragraph">We’ll be defining our variable, ‘sortedRows’ by a useMemo function, with a dependency on sortConfig and dataList, so that we re-render our sortedRows whenever our sort configuration changes, or whenever our data list changes.</p>



<p class="wp-block-paragraph">Next, we can turn our standard list of items into a LINQ list by putting it in a LINQ.from call. Now, in order to leverage LINQ&#8217;s sorting functionality, our list of values has to be an <strong>IOrderedEnumerable</strong> object. We can get this by applying a basic orderBy function to our LINQ and passing it a lambda that just returns one, which basically says sort this by the key ‘nothing’, and return ‘1’ in all cases to avoid doing any comparison. This returns us our list in an unmodified order, but as an IOrderedEnumerable type.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> //Set up default ordering
        let sorted = linq.from(dataList).orderBy(() => 1);
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #6A9955">//Set up default ordering</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">linq</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">from</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">orderBy</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">The reason why we want to do this is so we can apply multiple sorts on top of this which is possible by using the thenBy and <strong>thenyByDescending </strong>functions from LINQ and using those requires an IOrderedEnumerable. Now that that’s established, we can loop through each of the sorting configurations in order and check which sort type we’re applying.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>let sorted = linq.from(dataList).orderBy(() => 1);
        //Loop through the queue
        sortConfig.forEach((sortConfig) => {
            if (sortConfig.sortType === SortingType.Ascending) {
                //Ascending sorting
            } else {
                //Descending sorting
            }
        });</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">linq</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">from</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">orderBy</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">//Loop through the queue</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">forEach</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Ascending sorting</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Descending sorting</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        });</span></span></code></pre></div>



<p class="wp-block-paragraph">Our last step in sorting is to apply the thenBy conditional on the corresponding property, and LINQ will handle the complicated sorting for us, including comparing integers, strings, and dates. You can read more on LINQ functions, and even pass in your own comparable which is useful for handling sorting between more complex types, but in the case of this guide, we’ll just stick to basic sorting since we’re handling primitive types. If it’s descending, we can use <strong>thenByDescending</strong> which makes things easier.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> if (sortConfig.sortType === SortingType.Ascending) {
                sorted = sorted
                    .thenBy((dataRow) => dataRow&#91;sortConfig.propertyName&#93;);
            } else {
                sorted = sorted
                    .thenByDescending((dataRow) => dataRow&#91;sortConfig.propertyName&#93;);
            }</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sorted</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenBy</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sorted</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenByDescending</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span></code></pre></div>



<p class="wp-block-paragraph">In the code above, you see that the arguments for the lambda are an element of the <strong>sortedList. </strong>In this case, I named it <strong>dataRow</strong> because each item in the sorted is a LINQ&nbsp;from our dataList so we can think of it as one row. It then selects a corresponding key via the propertyName of our sortConfig, which as you recall is either “name”, “hours”, “startDate’, and “department”. In short, this is us targeting that specific column.</p>



<p class="wp-block-paragraph">Now, if you have null data, Javascript will run into the null comparison issue, which will mess up the sorting. A quick workaround I do is to sort all the data that is null on the bottom, but prefacing this <strong>thenBy</strong> with another thenBy that basically checks if the property is null.</p>



<p class="wp-block-paragraph">Here we return -1 when the data is null which means the object is ‘less than’ an object which does have data, and is sorted lower on the list.</p>



<p class="wp-block-paragraph">The last thing we need to do is to turn our LINQ into an array by calling <strong>.toArray()</strong>, and returning that value so that our <strong>sortedRows</strong> has an array of a sorted <strong>dataList</strong>. Putting it all together, we have this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>const sortedRows = useMemo(() => {
        //Set up default ordering
        let sorted = linq.from(dataList).orderBy(() => 1);
        //Loop through the queue
        sortConfig.forEach((sortConfig) => {
            if (sortConfig.sortType === SortingType.Ascending) {
                sorted = sorted
                    .thenBy((dataRow) => (dataRow&#91;sortConfig.propertyName&#93; === null ? -1 : 1))
                    .thenBy((dataRow) => dataRow&#91;sortConfig.propertyName&#93;);
            } else {
                sorted = sorted
                    .thenByDescending((dataRow) =>
                    dataRow&#91;sortConfig.propertyName&#93; === null ? -1 : 1
                    )
                    .thenByDescending((dataRow) => dataRow&#91;sortConfig.propertyName&#93;);
            }
        });
        return sorted.toArray();
    }, &#91;sortConfig, dataList&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">sortedRows</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">useMemo</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">//Set up default ordering</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">linq</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">from</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">orderBy</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">//Loop through the queue</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">forEach</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sorted</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenBy</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93; === </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4"> ? -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> : </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">))</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenBy</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">sorted</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenByDescending</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93; === </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4"> ? -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> : </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">                    )</span></span>
<span class="line"><span style="color: #D4D4D4">                    .</span><span style="color: #DCDCAA">thenByDescending</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">dataRow</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        });</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toArray</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    }, &#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">&#93;);</span></span></code></pre></div>



<p class="wp-block-paragraph">You should now have a functioning table with multiple sortable headers! A key thing to note is that you can pass a comparable to the thenBy function instead of just selecting by key. If for some reason things are not sorting as they should, that should be the first point of debugging.</p>



<h2 class="wp-block-heading" id="h-bonus-sorting-without-linq">Bonus: Sorting without LINQ</h2>



<p class="wp-block-paragraph">If you’ve made it this far, or just skipped ahead to this section, we’ll be going over the basics of sorting rows based on multiple headers by just using basic comparators.</p>



<p class="wp-block-paragraph">Comparators are just functions that take in two objects and return a number depending on how they relate to one another. A zero means they’re equal, positive numbers are greater, and negative numbers are less. Now let’s work on converting our sorting function to one that doesn’t use LINQ at all.</p>



<p class="wp-block-paragraph">Sorting multiple columns may seem complex, but in practice, it’s not really that difficult. Given a list of sorting configurations in the desired order, all you have to check is if the <strong>first comparator</strong> results in an equality, use the <strong>next comparator</strong> in order. If we have a list of {a ,1 }, {a , 2}, and {b, 1}. Sorting by the first column results in the equality of a’s. All we’d need to do is check our second column’s comparator to determine what order they should go in.</p>



<p class="wp-block-paragraph">In this guide, we’ve already implemented a function that can order our sort configurations for us. All we need to do is add a comparators to our SortConfiguration so we can keep track of which compare function we need to use.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>export interface SortingConfiguration{
    propertyName: keyof TableData,
    sortType: SortingType,
    compareFunction: TableDataComparable
}

export type TableDataComparable = ((a: TableData, b:TableData) => number);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">SortingType</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">compareFunction</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableDataComparable</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">type</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableDataComparable</span><span style="color: #D4D4D4"> = ((</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">:</span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">number</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p class="wp-block-paragraph">Next, we add that field to our sortBy function:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>const sortBy = useCallback(
        (propertyName: keyof TableData, compareFunction: TableDataComparable) => {
            let pendingChange = &#91;...sortConfig&#93;;
            const index = pendingChange.findIndex((config) => config.propertyName === propertyName)
            if(index > -1){
                //Save the sortType
                var currentSortType = pendingChange&#91;index&#93;.sortType;
                //Remove existing config
                pendingChange.splice(index, 1);
                //check if the sort type we saved is descending
                if (currentSortType === SortingType.Descending) {
                    pendingChange = &#91;
                        ...pendingChange,
                        { propertyName: propertyName, sortType: SortingType.Ascending , compareFunction: compareFunction},
                    &#93;;
                }
            } else {
                pendingChange = &#91;
                    ...pendingChange,
                    { propertyName: propertyName, sortType: SortingType.Descending, compareFunction: compareFunction },
                &#93;;
            }
            updateSortConfig(&#91;...pendingChange&#93;);
        },
        &#91;sortConfig&#93;
    )</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">sortBy</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">useCallback</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        (</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">compareFunction</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableDataComparable</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;...</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">index</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">findIndex</span><span style="color: #D4D4D4">((</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4"> &gt; -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Save the sortType</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">currentSortType</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//Remove existing config</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">splice</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955">//check if the sort type we saved is descending</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">currentSortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                        ...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                        { </span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortType:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4"> , </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">compareFunction</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">                    &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">            } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                    ...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                    { </span><span style="color: #9CDCFE">propertyName:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">propertyName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">sortType:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Descending</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">compareFunction</span><span style="color: #D4D4D4"> },</span></span>
<span class="line"><span style="color: #D4D4D4">                &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">updateSortConfig</span><span style="color: #D4D4D4">(&#91;...</span><span style="color: #9CDCFE">pendingChange</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        &#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span></code></pre></div>



<p class="wp-block-paragraph">Next, we update our interfaces and define comparators for each of our table columns.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>interface SortableHeaderProps {
    sortBy: (string: keyof TableData, compareFunction: TableDataComparable) => void;
    sortConfig: SortingConfiguration[];
}
...
const CompareByEquality = (column: keyof TableData) => (a: TableData, b: TableData) => {
        if(a&#91;column&#93; === b&#91;column&#93;){
            return 0
        } else{
            if (a&#91;column&#93; > b&#91;column&#93;){
                return 1;
            }
            return -1;
        }
    }

    const tableColumn = [
        {   label: 'Name', 
            property: 'name', 
            compareFunction: 
            (a: TableData, b: TableData) => {
                 return a&#91;'name'&#93;.localeCompare(b&#91;'name'&#93; as string) 
            } 
        },
        {
            label: 'Hours', 
            property: 'hours',
            compareFunction: CompareByEquality('hours')
        },
        {   label: 'Date', 
            property: 'startDate', 
            compareFunction: CompareByEquality('startDate') 
        },
        {   label: 'Department',
            property: 'department', 
            compareFunction: CompareByEquality('department') }
    ] as TableColumn[];</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SortableHeaderProps</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">: (</span><span style="color: #9CDCFE">string</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">compareFunction</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableDataComparable</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">void</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">SortingConfiguration</span><span style="color: #D4D4D4">[];</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">...</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CompareByEquality</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">keyof</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">&#93; === </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">&#93;){</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">        } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">&#93; &gt; </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">column</span><span style="color: #D4D4D4">&#93;){</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> -</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">tableColumn</span><span style="color: #D4D4D4"> = [</span></span>
<span class="line"><span style="color: #D4D4D4">        {   </span><span style="color: #9CDCFE">label:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Name&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">property:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">            (</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                 </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">&#91;</span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #DCDCAA">localeCompare</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">&#91;</span><span style="color: #CE9178">&apos;name&apos;</span><span style="color: #D4D4D4">&#93; </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">string</span><span style="color: #D4D4D4">) </span></span>
<span class="line"><span style="color: #D4D4D4">            } </span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">label:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Hours&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">property:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;hours&apos;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CompareByEquality</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;hours&apos;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        {   </span><span style="color: #9CDCFE">label:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Date&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">property:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;startDate&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CompareByEquality</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;startDate&apos;</span><span style="color: #D4D4D4">) </span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        {   </span><span style="color: #9CDCFE">label:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;Department&apos;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">property:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;department&apos;</span><span style="color: #D4D4D4">, </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">compareFunction:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">CompareByEquality</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&apos;department&apos;</span><span style="color: #D4D4D4">) }</span></span>
<span class="line"><span style="color: #D4D4D4">    ] </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TableColumn</span><span style="color: #D4D4D4">[];</span></span></code></pre></div>



<p class="wp-block-paragraph">Here, I just use equality for returning the values, but for more complex objects, you can define your own comparator function. As for the name, I used string’s localCompare as an example of an in-line lambda comparator.</p>



<p class="wp-block-paragraph">After that, we just add the compareFunction into our onClick, so that our sortBy function has all the correct parameters.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;TableCell key={index}
    		className={headerCell}
   	 	onClick={() => sortBy(column.property, column.compareFunction)}
>
&lt;TableCell key={index}
    		className={headerCell}
   	 	onClick={() => sortBy(column.property, column.compareFunction)}
></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">    		</span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">headerCell</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">   	 	</span><span style="color: #9CDCFE">onClick</span><span style="color: #D4D4D4">={() =&gt; </span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">(column.property, column.compareFunction)}</span></span>
<span class="line"><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">&lt;</span><span style="color: #9CDCFE">TableCell</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">index</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">    		</span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">={</span><span style="color: #9CDCFE">headerCell</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">   	 	</span><span style="color: #9CDCFE">onClick</span><span style="color: #D4D4D4">={() =&gt; </span><span style="color: #DCDCAA">sortBy</span><span style="color: #D4D4D4">(column.property, column.compareFunction)}</span></span>
<span class="line"><span style="color: #D4D4D4">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Lastly, we need to change our definition for sortedRows:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">TypeScript</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>const sortedRows = useMemo(() => {
        if(sortConfig.length === 0){
            return &#91;...dataList&#93;;
        }
        let sorted = &#91;...dataList&#93;.sort(
            (a: TableData, b:TableData) =>{
                 for(const config of sortConfig){
                    const result = (config.compareFunction(a,b))
                    if(result !== 0){
                        if(config.sortType === SortingType.Ascending){
                            return result;
                        }
                        else{
                            return -result;
                        }
                    }
                }
                return 0;
            }
        )
        return(sorted)
    }, &#91;sortConfig, dataList&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">sortedRows</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">useMemo</span><span style="color: #D4D4D4">(() </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4"> === </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &#91;...</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">let</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4"> = &#91;...</span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">&#93;.</span><span style="color: #DCDCAA">sort</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            (</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">:</span><span style="color: #4EC9B0">TableData</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">                 </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">config</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">of</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">result</span><span style="color: #D4D4D4"> = (</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">compareFunction</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a</span><span style="color: #D4D4D4">,</span><span style="color: #9CDCFE">b</span><span style="color: #D4D4D4">))</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4"> !== </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">sortType</span><span style="color: #D4D4D4"> === </span><span style="color: #9CDCFE">SortingType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Ascending</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                        }</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">                            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> -</span><span style="color: #9CDCFE">result</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                        }</span></span>
<span class="line"><span style="color: #D4D4D4">                    }</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        )</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">sorted</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    }, &#91;</span><span style="color: #9CDCFE">sortConfig</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">dataList</span><span style="color: #D4D4D4">&#93;);</span></span></code></pre></div>



<p class="wp-block-paragraph">First, we check if there’s a sort configuration and if there isn’t we want to go back to our unsorted state by returning a copy of the data list.</p>



<p class="wp-block-paragraph">If there is a sort configuration, we make a copy of dataList using the spread operator and sort with a lambda function that goes over our loop of sortConfigs. It then tests each a, and b, TableData against the compareFunction in the sortConfig. If we have an equal match, we try to and apply the subsequent sort config until we have a result that isn’t 0. Next, we check if it’s ascending or descending, and so we flip the result to its opposite value with a negative sign. Lastly, we finish going through our sort configuration and find that all matches, then we know both rows are equal.</p>



<p class="wp-block-paragraph">That about does it for sorting multiple columns in React.</p>



<p class="wp-block-paragraph"><strong>Learn more about DMC&#8217;s <a href="https://static.dmcinfo.com/services/application-development">Application Development expertise</a>.</strong></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/19887/sorting-multiple-columns-in-a-table-with-react/">Sorting Multiple Columns in a Table with React</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A Simple Guide to Material UI Grids</title>
		<link>https://static.dmcinfo.com/blog/20000/a-simple-guide-to-material-ui-grids/</link>
		
		<dc:creator><![CDATA[Rafael Rejuso]]></dc:creator>
		<pubDate>Wed, 22 Apr 2020 11:16:47 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<category><![CDATA[React]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/20000/a-simple-guide-to-material-ui-grids/</guid>

					<description><![CDATA[<p>If you’ve ever had to work with UI frameworks, you know that they can save lots of time on&#160;a project. I&#160;recently set up a layout for a complicated system using Material UI Grids for the first time. Since I didn&#8217;t find any&#160;simple tutorials to follow, I created this one. You will need these dependencies to [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/20000/a-simple-guide-to-material-ui-grids/">A Simple Guide to Material UI Grids</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">If you’ve ever had to work with UI frameworks, you know that they can save lots of time on&nbsp;a project. I&nbsp;recently set up a layout for a complicated system using Material UI Grids for the first time. Since I didn&#8217;t find any&nbsp;simple tutorials to follow, I created this one.</p>



<p class="wp-block-paragraph">You will need these dependencies to follow along:</p>



<ul class="wp-block-list">
<li>React</li>



<li>Material-UI</li>



<li>React Developer Tools (optional)</li>



<li>randomcolor (optional)</li>
</ul>



<h2 class="wp-block-heading" id="h-what-are-grids">What are Grids?</h2>



<p class="wp-block-paragraph">A <strong>grid </strong>is a container or item that automatically handles different screen sizes and orientations. The grids can change their size depending on the window’s current size and adjust shape accordingly. This ensures that we give the users exactly the best interface and it allows the content to appear consistent across different platforms.</p>



<h2 class="wp-block-heading" id="h-how-to-get-grids">How to <em>Get</em> Grids</h2>



<p class="wp-block-paragraph">If you already know how to add Material-UI to your current project, you can skip this section. Otherwise, you can add the dependency by running:</p>



<ul class="wp-block-list">
<li>npm install @material-ui/core or</li>



<li>yarn add @material-ui/core</li>
</ul>



<p class="wp-block-paragraph">To make this tutorial easier to follow, we’ll also be adding <em>randomcolor</em> so that we can visually see our grids easier.</p>



<p class="wp-block-paragraph">After that’s done, simply import all the elements we installed, and we can start working on learning the basics of Material-UI Grids.</p>



<p class="wp-block-paragraph">Let&#8217;s start with:&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import React from 'react';
import './App.css';
import {Grid} from '@material-ui/core';
import randomColor from 'randomcolor';

function App() {
  return (
    &lt;div className="App" style={{background:randomColor()}}>
     Hooray nothing is here!
    &lt;/div>
  );
}

export default App;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">React</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;react&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;./App.css&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> {</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">} </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;@material-ui/core&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">randomColor</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;randomcolor&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">     Hooray nothing is here!</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">App</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p class="wp-block-paragraph">It shows you something like this:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/1-nothingishere.png" alt=""/></figure>



<h2 class="wp-block-heading" id="h-getting-started-is-easy">Getting Started is Easy</h2>



<p class="wp-block-paragraph">To use Material UI Grids, we can&nbsp;start with wrapping our <strong>‘Hooray nothing is here!&#8217;</strong> with a Grid, and notice that nothing changes.</p>



<p class="wp-block-paragraph">You can think of <strong>Grids </strong>like a ‘replacement’ for a div, but they’re much more special.</p>



<h2 class="wp-block-heading" id="h-grid-item-vs-grid-container">Grid Item vs. Grid Container?</h2>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import React from 'react';
import './App.css';
import {Grid} from '@material-ui/core';
import randomColor from 'randomcolor';

function App() {
  return (
    &lt;div  className="App">
        &lt;Grid style={{background:randomColor()}}>
          Hooray something is here!
        &lt;/Grid>
    &lt;/div>
  );
}

export default App;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">React</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;react&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;./App.css&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> {</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">} </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;@material-ui/core&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">randomColor</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;randomcolor&apos;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Hooray something is here!</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">export</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">App</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p class="wp-block-paragraph">A Grid can have two types of layouts: <strong>containers</strong> and <strong>items</strong>. It’s a pretty easy concept, a <em>container </em>contains grid items, and a grid <em>item </em>is in a grid container. A container has special properties that can be set but we’ll touch on that later. The two properties are not mutually exclusive, so you can have a grid that’s both an item and a container.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>function App() {
  return (
    &lt;div  className="App">
      &lt;Grid container>
        &lt;Grid item style={{background:randomColor()}}>
          Hooray something is here!
        &lt;/Grid>
      &lt;/Grid>
    &lt;/div>
  );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Hooray something is here!</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-grid-items-columns-and-break-points">Grid Items, Columns, and Break Points</h2>



<p class="wp-block-paragraph">This section contains the most important information for&nbsp;understanding Material UI Grids.&nbsp;Feel free to re-read it a few times if it doesn’t make sense at first.&nbsp;</p>



<p class="wp-block-paragraph">By default, Material UI Grids will try to space your items perfectly evenly, so if you have something simple, like 4 grids items, each item will take up 25% of the window.</p>



<p class="wp-block-paragraph">But, Material UI Grids work&nbsp;on a 12 column grid-layout, and each grid width is a certain percentage of that. So, if we have a Grid of 6, that width should be about 50%.</p>



<p class="wp-block-paragraph">So we can have something like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>function App() {
  return (
    &lt;div  className="App">
      &lt;Grid container>
        &lt;Grid item xs={6} style={{background:randomColor()}}>
          Hooray something is here!
        &lt;/Grid>
        &lt;Grid item xs={6} style={{background:randomColor()}}>
          Hooray something is too!
        &lt;/Grid>
      &lt;/Grid>
    &lt;/div>
  );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">6</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Hooray something is here!</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">6</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          Hooray something is too!</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">There are a couple of key things to note here like containers and items, but we’ll cover that later. What we’re more interested in is the property that says xs={6}.</p>



<p class="wp-block-paragraph">Like I stated before, Material UI divides the numbers we give it to 12 columns and spaces our content appropriately. Now, we have a layout that looks something like this:</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/2-somethingthere_1.png" alt=""/></figure>



<p class="wp-block-paragraph">Material-UI defines how the Grid acts according to specific breakpoints. Below is a table that shows when a specific breakpoint is reached.</p>


<table style="width:100%; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; margin-bottom:40px;">
<tbody>
<tr style="text-align:center;">
<th style="border-collapse:collapse; border-style:solid; border-width:medium; border-spacing: 20px; border:1px solid black; height:100px; font-size:24px; border-right-style:solid; border-right-width:medium; border-left-style:solid; border-left-width:medium;"><strong>Breakpoint Key</strong></th>
<th style="border-collapse:collapse; border-style:solid; border-width:medium; border-spacing: 20px; border:1px solid black; height:100px; font-size:24px; border-right-style:solid; border-right-width:medium; border-left-style:solid; border-left-width:medium;"><strong>Window Size</strong></th>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">xs</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">0-599 px</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">sm</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">600px &ndash; 959px</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">md</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">960px &ndash; 1279px</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">lg</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">1280 &ndash; 1919px</td>
</tr>
<tr>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">xl</td>
<td style="text-align:center; vertical-align:middle; border-collapse:collapse; border:1px solid black; border-style:solid; border-width:medium; font-size:24px;">1920px+</td>
</tr>
</tbody>
</table>


<p class="wp-block-paragraph">Breakpoints are defined starting from the bottom up, meaning if we have <em>xs </em>defined, but not <em>sm </em>or <em>md</em>, it will apply that breakpoint style of the lowest possible key.</p>



<p class="wp-block-paragraph">If we were to define an <em>md </em>key, then our <em>xs </em>breakpoint would apply, up until we hit that <em>md</em> window size. Our defined <em>xs </em>key only affects screen widths between 0-959px. At 960+ px, our <em>md</em> key would apply.</p>



<p class="wp-block-paragraph">That was a lot of information, so let’s see it in practice.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Resizing-windows.gif" alt="resizing mindows."/></figure>



<p class="wp-block-paragraph">In the gif above, each of the four different lines on the bottom of the screen represent different breakpoints. As you can see, when the window screen crosses across the different boundaries, we apply the properties that were specified to Material UI.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;Grid container>
  &lt;Grid item xs={6} sm={2} md={8} lg={12} xl={3} style={{background:randomColor()}}>
     Hooray something is here!
  &lt;/Grid>
  &lt;Grid item xs={6} sm={10} md={4} lg={12} xl={9} style={{background:randomColor()}}>
     Hooray something is too!
  &lt;/Grid>
&lt;/Grid></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">6</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sm</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">2</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">md</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">8</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lg</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">12</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xl</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">3</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">     Hooray something is here!</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">6</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sm</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">10</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">md</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">4</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lg</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">12</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xl</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">9</span><span style="color: #569CD6">}</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">     Hooray something is too!</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">One thing to note is that, if we look at xs={6} for both of our Grid items, it splits the space evenly. When we get to the breakpoint of <em>lg</em> and specify the {12} size, we basically ‘fill’ that 12 column limit and move our content on to a new row.</p>



<p class="wp-block-paragraph">By placing our breakpoints to equal 12, we say that we want this Grid item to occupy its own row.</p>



<p class="wp-block-paragraph">This might be enough for the given use case, but with Grid containers, we can go even further.</p>



<h2 class="wp-block-heading" id="h-container-magic">Container Magic</h2>



<p class="wp-block-paragraph">With Grid Containers, we can arrange all of our grid items the way that we want to. The first thing we want to do is add spaces around the grid items so that the content isn&#8217;t directly touching one another. We can add the prop <strong>‘spacing’</strong> and which takes in a value between 0 and 10.</p>



<p class="wp-block-paragraph">The space between each grid is the number you chose, times 8pixel. For example, spacing={2} is 16 pixels.</p>



<p class="wp-block-paragraph">For this example, we’ll refactor it slightly so that the background color only applies to the content inside the grid, and not the actual grid itself, so we can see the spacing.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>function App() {
  return (
    &lt;div  className="App">
      &lt;Grid container spacing={3}>
        &lt;Grid item xs={6}>
          &lt;div style={{background:randomColor()}}>Hooray something is here!&lt;/div>
        &lt;/Grid>
        &lt;Grid item xs={6}>
          &lt;div style={{background:randomColor()}}> Hooray something is too! &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs={4}>
          &lt;div style={{background:randomColor()}}> Another item! &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs={4}>
          &lt;div style={{background:randomColor()}}> Showing off rows! &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs={4}>
          &lt;div style={{background:randomColor()}}> Last item! &lt;/div>
        &lt;/Grid>
      &lt;/Grid>
    &lt;/div>
  );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">spacing</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">={{</span><span style="color: #C8C8C8">background</span><span style="color: #D4D4D4">:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}}&gt;</span><span style="color: #9CDCFE">Hooray</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">something</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">is</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">here</span><span style="color: #D4D4D4">!&lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">={{</span><span style="color: #C8C8C8">background</span><span style="color: #D4D4D4">:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}}&gt; </span><span style="color: #9CDCFE">Hooray</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">something</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">is</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">too</span><span style="color: #D4D4D4">! &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">={{</span><span style="color: #C8C8C8">background</span><span style="color: #D4D4D4">:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}}&gt; </span><span style="color: #9CDCFE">Another</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4">! &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">={{</span><span style="color: #C8C8C8">background</span><span style="color: #D4D4D4">:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}}&gt; </span><span style="color: #9CDCFE">Showing</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">off</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">rows</span><span style="color: #D4D4D4">! &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">={</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">}&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          &lt;</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">={{</span><span style="color: #C8C8C8">background</span><span style="color: #D4D4D4">:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}}&gt; </span><span style="color: #9CDCFE">Last</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4">! &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      &lt;/</span><span style="color: #9CDCFE">Grid</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    &lt;/</span><span style="color: #9CDCFE">div</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">And now, we have our grids spaced apart!</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/3-finalgrids.png" alt=""/></figure>



<p class="wp-block-paragraph">We can also add the prop <strong>direction</strong> to our <strong>container</strong> to pick if we want the grids to be in row or column form. When the direction is in a <strong>column</strong>, instead of the default row configuration, each grid gets its own row.</p>



<p class="wp-block-paragraph">We can still define breakpoints to size our component, however, the breakpoint values will only effect width, so an xs={6} will continue to occupy about 50% of the page.</p>



<h2 class="wp-block-heading" id="h-lazy-layouts-auto-layout">Lazy Layouts (Auto-layout)</h2>



<p class="wp-block-paragraph">There’s been a lot of talk about breakpoints which may be off-putting, however, Grids has an answer with its auto-layout functionality. In a given row, we only need to define at least one actual numeric value of the items in a given breakpoint for the system to figure itself out. We still have to specify that the Grid items are the same breakpoints, but with this, we only have to write one number:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">React (JSX)</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>function App() {
  return (
    &lt;div  className="App">
      &lt;Grid container spacing={3}>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> A&lt;/div>
        &lt;/Grid>
        &lt;Grid item xs={7}>
          &lt;div style={{background:randomColor()}}> B &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> C &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> D &lt;/div>
        &lt;/Grid>
      &lt;/Grid>
      &lt;Grid container spacing={3}>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> 1&lt;/div>
        &lt;/Grid>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> 2 &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> 3 &lt;/div>
        &lt;/Grid>
        &lt;Grid item xs>
          &lt;div style={{background:randomColor()}}> 4 &lt;/div>
        &lt;/Grid>
      &lt;/Grid>
    &lt;/div>
  );
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">App</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">className</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;App&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">spacing</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">3</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> A</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">7</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> B </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> C </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> D </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">container</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">spacing</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #B5CEA8">3</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> 1</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> 2 </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> 3 </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #4EC9B0">Grid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xs</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">style</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">{</span><span style="color: #9CDCFE">background:</span><span style="color: #DCDCAA">randomColor</span><span style="color: #D4D4D4">()}</span><span style="color: #569CD6">}</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4"> 4 </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #808080">&lt;/</span><span style="color: #4EC9B0">Grid</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/4-final-final-grids_1.png" alt=""/></figure>



<p class="wp-block-paragraph">That about does it for Material-UI Grids.</p>



<p class="wp-block-paragraph"><strong>Learn more about DMC&#8217;s <a href="/services/application-development">Application Development Expertise</a> and <a href="/contact">contact us</a> with project inquiries!</strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/20000/a-simple-guide-to-material-ui-grids/">A Simple Guide to Material UI Grids</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
