{"data":{"content":{"fields":{"slug":"/labs/forms-and-validation","type":"lab"},"frontmatter":{"title":"Forms and Validation"},"html":"<h1>Lab Five - Forms and Validation</h1>\n<h2>Switch to Lab05</h2>\n<ul>\n<li>In a terminal:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">cd ../ # presuming still in previous lab\ncd lab-05\nyarn start</code></pre></div>\n<h3>Check it out!</h3>\n<ul>\n<li>While we were working on the last lab, the rest of the team was adding lots of new stuff to the app</li>\n<li>\n<p>Before proceeding, let’s look at the progress that has been made:</p>\n<ul>\n<li>The component files needed to create and edit employees, timesheets, and timeunits have been created for you. This lab will walk you through the implementation of some of those features.</li>\n<li>You’ll also notice that <strong>React Router</strong> has been added to some of our previous components. More on that later.</li>\n</ul>\n</li>\n</ul>\n<h3>Add the Routes for Create/Update</h3>\n<ul>\n<li>Before we can do anything, we need to add more routes to our application and tie them together with the appropriate handlers.</li>\n<li>Open <strong>src/App.js</strong> and update the Routes under the ‘Switch’ tag to match the following:</li>\n</ul>\n<div class=\"gatsby-code-title\">src/App.js</div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Route</span> <span class=\"token attr-name\">exact</span> <span class=\"token attr-name\">path</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>/projects<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">component</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>Projects<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Route</span> <span class=\"token attr-name\">exact</span> <span class=\"token attr-name\">path</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>/projects/detail/:_id?<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">component</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>ProjectsDetail<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Route</span> <span class=\"token attr-name\">exact</span> <span class=\"token attr-name\">path</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>/employees<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">component</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>Employees<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Route</span> <span class=\"token attr-name\">exact</span> <span class=\"token attr-name\">path</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>/employees/detail/:_id?<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">component</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>EmployeeDetail<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Route</span> <span class=\"token attr-name\">exact</span> <span class=\"token attr-name\">path</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>/timesheets<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">component</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>Timesheets<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Route</span> <span class=\"token attr-name\">exact</span> <span class=\"token attr-name\">path</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>/timesheets/detail/:_id?<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">component</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>TimesheetsDetail<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Route</span>\n  <span class=\"token attr-name\">exact</span>\n  <span class=\"token attr-name\">path</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>/timesheets/detail/:timesheet_id/timeunits/detail/:_id?<span class=\"token punctuation\">\"</span></span>\n  <span class=\"token attr-name\">component</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>TimeunitsDetail<span class=\"token punctuation\">}</span></span>\n<span class=\"token punctuation\">/></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Redirect</span> <span class=\"token attr-name\">to</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>/employees<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span></code></pre></div>\n<blockquote>\n<p>Take the time to check out the path declarations and how they are adding route params that are dynamically replaced.</p>\n</blockquote>\n<h3>Formik? What’s this Formik thing?</h3>\n<p>If we really wanted to, we could absolutely create our own user input/validation framework from scratch in React, but why reinvent the wheel when there’s awesome libraries out there that do the heavy lifting for us.\nIn the real world, you’ll almost certainly use one of several popular User Input/Form libraries such as <a href=\"https://redux-form.com\">Redux Form</a>, <a href=\"https://github.com/final-form/react-final-form\">React Final Form</a>, or <a href=\"https://jaredpalmer.com/formik\">Formik</a>.\nFor this example application, we’re using Formik.</p>\n<p>Formik is a wrapper around Forms that takes care of some basic considerations like setup/reset/teardown, validation, and state management. It’s a very lightweight solution which means it’s easy to setup and very fast, but it doesn’t do as much for you as others like <code class=\"language-text\">redux-form</code> which can lead to some boilerplate (but way less than you’d have doing it all yourself!)</p>\n<h3>Add Create/Edit Employee Functionality</h3>\n<ul>\n<li>\n<p>Now let’s set up a way to edit an employee.</p>\n</li>\n<li>\n<p>The first component we need is a form to contain all of our employee’s properties.</p>\n</li>\n<li>\n<p>Open <strong>src/employees/EmployeeForm.js</strong>.</p>\n</li>\n<li>\n<p>Let’s review the <code class=\"language-text\">props</code> of this component:</p>\n<ul>\n<li>employee : the employee we will be editing</li>\n<li>handleSave: the callback to call when the user submits the form</li>\n</ul>\n</li>\n<li>\n<p>We need to define the Form element and integrate it with Formik so we get all of the helpful validation and support mechanisms.</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> employee <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Formik</span>\n      <span class=\"token attr-name\">initialValues</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span>\n      <span class=\"token attr-name\">validate</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>validate <span class=\"token punctuation\">}</span></span>\n      <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleSave <span class=\"token punctuation\">}</span></span>\n      <span class=\"token attr-name\">enableReinitialize</span>\n    <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> isValid<span class=\"token punctuation\">,</span> errors<span class=\"token punctuation\">,</span> touched<span class=\"token punctuation\">,</span> handleReset<span class=\"token punctuation\">,</span> handleSubmit <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Form</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        \n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>Form</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>Formik</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<blockquote>\n<p>This block defines the <code class=\"language-text\">Formik</code> Higher-Order-Component (HOC) - this is a wrapper around a child <code class=\"language-text\">Form</code> which adds behaviors to make it more capable than it is by itself.\nThis component takes initial values to populate the form with (or reset the form to if the user wants to reset) as well as hooks to call functions for validation and submission.\n<code class=\"language-text\">enableReinitialize</code> is a hint for Formik to refresh when we give it new data.\nWithin the <code class=\"language-text\">Formik</code> component is something called a “render prop” - this is a more advanced pattern that is used by some third-party libraries to allow you to define content\nto be nested inside third-party components while still retaining the ability to apply custom logic, styles, etc like you could in your own React code.</p>\n</blockquote>\n<blockquote>\n<p>Note the five render props being passed down - ‘isValid’, ‘errors’, ‘touched’, ‘handleReset’, and ‘handleSubmit’. These are all values and functions provided by Formik. The first two give us access\nto the validation state of the form (true or false) and what errors exist in the form, ‘touched’ tells us what fields the user has interacted with, and the last two are event handlers that can be called to submit or reset the form. Formik provides\na <em>ton</em> more props for more advanced scenarios, but we don’t need them here.</p>\n</blockquote>\n<ul>\n<li>\n<p>Great! We have an empty form…probably need to add some content in there.</p>\n</li>\n<li>\n<p>A helpful member of your team has created a reusable component for Forms that takes care of wrapping an input element with an appropriate label and validation logic. Let’s just reuse that! Hooray for reusable shared components!</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>FieldWrapper</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>username<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">label</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Username<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">invalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>errors<span class=\"token punctuation\">.</span>username<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">touched</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>touched<span class=\"token punctuation\">.</span>username<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>FieldWrapper</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>email<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">label</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Email<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">invalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>errors<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">touched</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>touched<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>FieldWrapper</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>firstName<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">label</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>First Name<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">invalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>errors<span class=\"token punctuation\">.</span>firstName<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">touched</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>touched<span class=\"token punctuation\">.</span>firstName<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>FieldWrapper</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>lastName<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">label</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Last Name<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">invalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>errors<span class=\"token punctuation\">.</span>lastName<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">touched</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>touched<span class=\"token punctuation\">.</span>lastName<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>FieldWrapper</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>checkbox<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>admin<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">label</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Admin<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">invalid</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>errors<span class=\"token punctuation\">.</span>admin<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">touched</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>touched<span class=\"token punctuation\">.</span>admin<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span></code></pre></div>\n<ul>\n<li>\n<p>Here we’re defining five fields - the <code class=\"language-text\">FieldWrapper</code> component takes a few props:</p>\n<ul>\n<li><code class=\"language-text\">type</code> is used to define what type of form field to render - text, checkbox, select menu, etc</li>\n<li><code class=\"language-text\">name</code> is a unique name within the form for the value of each field</li>\n<li><code class=\"language-text\">label</code> is the text to show next to the field so the user knows what it is</li>\n<li><code class=\"language-text\">invalid</code> is a hint to the field whether Formik’s validation has any problems with the value in that field. It will be an error message if a validation issue was found</li>\n<li><code class=\"language-text\">touched</code> is a hint to the field as to whether the user has interacted with it yet</li>\n</ul>\n</li>\n<li>\n<p>Lastly we need to give the ability for the user to Save or Reset the form.</p>\n</li>\n<li>\n<p>At the very bottom of the <code class=\"language-text\">Form</code> element, we can add another nice reusable Form component somebody on our team created - the <code class=\"language-text\">FormControls</code> component. This contains a submit and reset button.</p>\n</li>\n</ul>\n<div class=\"gatsby-code-title\">src/employees/EmployeeForm.js</div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>FormControls</span>\n  <span class=\"token attr-name\">allowSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>isValid<span class=\"token punctuation\">}</span></span>\n  <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span></span>\n  <span class=\"token attr-name\">onReset</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleReset<span class=\"token punctuation\">}</span></span>\n<span class=\"token punctuation\">/></span></span></code></pre></div>\n<ul>\n<li>\n<p>Note how we’re using another Formik-supplied value here <code class=\"language-text\">isValid</code> - this tells us whether the entire form has passed validation. Once it has, we’ll enable the save button.</p>\n</li>\n<li>\n<p>There, our Form is complete. However, we need to finish implementing what should happen when the Form detects a submission.</p>\n</li>\n<li>\n<p>We’ve already told the <code class=\"language-text\">Formik</code> component to call <code class=\"language-text\">handleSave</code> in this situation. Here’s what the <code class=\"language-text\">handleSave</code> function should look like:</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token function-variable function\">handleSave</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>values<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span><span class=\"token function\">handleSave</span><span class=\"token punctuation\">(</span>values<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<blockquote>\n<p>Notice that we are not actually implementing the save function. That is left for the component that uses this form to implement and pass it in as a prop.</p>\n</blockquote>\n<ul>\n<li>We haven’t defined <code class=\"language-text\">validate()</code> yet, so let’s do that next. Here’s what it should look like:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token function-variable function\">validate</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>values<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> errors <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>values<span class=\"token punctuation\">.</span>username<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    errors<span class=\"token punctuation\">.</span>username <span class=\"token operator\">=</span> <span class=\"token string\">'Required'</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>values<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    errors<span class=\"token punctuation\">.</span>email <span class=\"token operator\">=</span> <span class=\"token string\">'Required'</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> errors<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>We’re simply checking that we have values for a few fields. Formik will automatically call this as the user inputs data and will reflect those errors back to the user via our <strong>FieldWrapper</strong> components.</li>\n<li>Until now we’ve assumed that the user is creating a new employee record. What if the <code class=\"language-text\">EmployeeForm</code> is being used to edit an existing employee?</li>\n<li>We already know that this component can receive an <code class=\"language-text\">employee</code> in its props, what we need to do is update the form to reflect that employee’s values.</li>\n<li>The <code class=\"language-text\">Formik</code> component gives us the <code class=\"language-text\">initialValues</code> prop to do this. Replace the empty declaration you currently have with the following:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\">initialValues<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span> employee <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">{</span>\n  username<span class=\"token punctuation\">:</span> employee<span class=\"token punctuation\">.</span>username <span class=\"token operator\">||</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\n  email<span class=\"token punctuation\">:</span> employee<span class=\"token punctuation\">.</span>email <span class=\"token operator\">||</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\n  firstName<span class=\"token punctuation\">:</span> employee<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">||</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\n  lastName<span class=\"token punctuation\">:</span> employee<span class=\"token punctuation\">.</span>lastName <span class=\"token operator\">||</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\n  admin<span class=\"token punctuation\">:</span> employee<span class=\"token punctuation\">.</span>admin <span class=\"token operator\">||</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\n  _id<span class=\"token punctuation\">:</span> employee<span class=\"token punctuation\">.</span>_id\n<span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Add the Form into an Employee Detail Component</h2>\n<ul>\n<li>Now let’s actually use the form we just built.</li>\n<li>Open <strong>/src/employees/EmployeeDetail.js</strong></li>\n<li>Let’s setup our local state, first. We will need to set the initial state of our employee object, like so:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\">  state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    employee<span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Next, let’s fetch the employee data. We’ll want to call the API when the component mounts and set the local state with the employee object. We can use the <code class=\"language-text\">axios</code> library to help us make HTTP requests.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\">  <span class=\"token keyword\">async</span> <span class=\"token function\">componentDidMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> match <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> _id <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> match<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> data<span class=\"token punctuation\">:</span> employee <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Axios<span class=\"token punctuation\">.</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token function\">url</span><span class=\"token punctuation\">(</span>_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> employee <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>\n<p>We use react-router to give us the parameters that <code class=\"language-text\">match</code>-ed from the <code class=\"language-text\">Route</code> - in this instance, we’ll get the employee ID from the URL. We use that to fetch the corresponding employee record.</p>\n</li>\n<li>\n<p>Next, let’s update the render function to include the <code class=\"language-text\">EmployeeForm</code>, and pass it all the props it needs:</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Employee Detail</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>EmployeeForm</span>\n        <span class=\"token attr-name\">employee</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>employee<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">handleSave</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleSave<span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>Notice that we’re passing <code class=\"language-text\">EmployeeForm</code> a reference to <code class=\"language-text\">this.handleSave</code>, which we still need to define:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token function-variable function\">handleSave</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>values<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> history <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> values<span class=\"token punctuation\">.</span>_id <span class=\"token operator\">?</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">onUpdate</span><span class=\"token punctuation\">(</span>values<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">onCreate</span><span class=\"token punctuation\">(</span>values<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    result<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      history<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/employees'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>\n<p>When handleSave is called we’ll:</p>\n<ul>\n<li>Check to see if the record being saved already has an ID - if yes it’s an update, if not it’s a create.</li>\n<li>We call the corresponding handler function to begin the appropriate async function</li>\n<li>Once complete, we’ll tell react-router to send the user back to the “/employees” route so they see the table.</li>\n</ul>\n</li>\n<li>\n<p>Finally, we’ll implement the <code class=\"language-text\">onUpdate</code> and <code class=\"language-text\">onCreate</code> functions, to persist the employee with our PUT and POST APIs.</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"> onUpdate <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> employee <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Axios<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span><span class=\"token function\">url</span><span class=\"token punctuation\">(</span>employee<span class=\"token punctuation\">.</span>_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> employee<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> response<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  onCreate <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> employee <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Axios<span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token function\">url</span><span class=\"token punctuation\">(</span>employee<span class=\"token punctuation\">.</span>_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> employee<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> response<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p> </p>\n<h2>Test the Employee Detail Component</h2>\n<ul>\n<li>Open <strong>/src/employees/EmployeeDetail.test.js</strong></li>\n<li>Use jest.mock to mock our API calls</li>\n<li>Add a test to verify the component renders as expected:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\">jest<span class=\"token punctuation\">.</span><span class=\"token function\">mock</span><span class=\"token punctuation\">(</span><span class=\"token string\">'axios'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">get</span><span class=\"token punctuation\">:</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  put<span class=\"token punctuation\">:</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  post<span class=\"token punctuation\">:</span> jest<span class=\"token punctuation\">.</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">describe</span><span class=\"token punctuation\">(</span><span class=\"token string\">'&lt;EmployeeDetail />'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'should instantiate the Employee Detail Component'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> component <span class=\"token operator\">=</span> <span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>EmployeeDetail</span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    component<span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> employee<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span> _id<span class=\"token punctuation\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>component<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toIncludeText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Employee Detail'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>Run the tests and verify that they pass before moving on to the next section.</li>\n</ul>\n<h2>Add navigation to the Employee Detail Component</h2>\n<ul>\n<li>\n<p>We have an Employee Detail route, but there’s no way to get to it yet.</p>\n</li>\n<li>\n<p>We’re going to add functionality so that when you click an <strong>EmployeeRow</strong>, the router will transition to the appropriate detail route for the employee.</p>\n</li>\n<li>\n<p>Open <strong>/src/employees/EmployeeRow.js</strong></p>\n</li>\n<li>\n<p>Add the <code class=\"language-text\">showDetail()</code> method to the <strong>EmployeeRow</strong></p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token function-variable function\">showDetail</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> history<span class=\"token punctuation\">,</span> employee <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n   \n   <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>employee<span class=\"token punctuation\">.</span>deleted<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n     console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'You cannot edit a deleted employee.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n     <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n   <span class=\"token punctuation\">}</span>\n\n   history<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token string\">`/employees/detail/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>employee<span class=\"token punctuation\">.</span>_id<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>\n<p>This first checks to see if the employee has been deleted and prevents viewing it if so</p>\n</li>\n<li>\n<p>Then it uses the <strong>history</strong> prop provided by <code class=\"language-text\">react-router</code> to change the current URL programmatically (and thus change the matched route)</p>\n</li>\n<li>\n<p>Now add an <code class=\"language-text\">onClick()</code> handler to the <code class=\"language-text\">&lt;tr/&gt;</code> in the <code class=\"language-text\">render()</code> method.</p>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>tr</span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>employee<span class=\"token punctuation\">.</span>deleted <span class=\"token operator\">?</span> <span class=\"token string\">'deleted'</span> <span class=\"token punctuation\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>showDetail<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span></code></pre></div>\n<ul>\n<li>Open your app and click on an employee… did it work!?!?!?</li>\n</ul>\n<h2>Add ability to create a new Employee</h2>\n<ul>\n<li>Navigate to <strong>src/employees/Employees.js</strong>.</li>\n<li>Let’s add a new Button the user can click to create an Employee. Add this next to the <code class=\"language-text\">EmployeeTable</code>:</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Link</span> <span class=\"token attr-name\">to</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>/employees/detail<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>Button</span> <span class=\"token attr-name\">bs</span><span class=\"token style-attr language-css\"><span class=\"token attr-name\"><span class=\"token attr-name\">Style</span></span><span class=\"token punctuation\">=\"</span><span class=\"token attr-value\">primary</span><span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    New Employee\n  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>Button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>Link</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<ul>\n<li>\n<p>What’s going on here? We’re using a <strong>react-router</strong> <code class=\"language-text\">Link</code> element which, when clicked, will send the user to the Route that causes the EmployeeDetail component to render. Inside the Link we specify a component to render that is clickable.</p>\n</li>\n<li>\n<p>That’s it! We already made our EmployeeDetail component smart enough to know that, if it wasn’t given an Employee object with an ID set, that we were creating a new one. Cool!</p>\n</li>\n</ul>\n<h2>Extra credit</h2>\n<p>The <strong>ProjectDetail</strong> component has been implemented already. Can you get it hooked up to allow Project create/update? How about adding Delete/Restore to the ProjectTable?</p>\n<p>Are you a true champion? Figure out how to add validation to prevent the user from creating an Employee with the same name or username as an existing Employee.</p>\n<p>Hint: You might be tempted to drag data down to use it in child components, but it’s sometimes easier to leave data up high and pass down worker functions from a parent to a child component.</p>\n<h3>Commit your changes to Git - congrats, you are a Forms Master.</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">git add .\ngit commit -m &quot;We are validating forms&quot;</code></pre></div>"}},"pageContext":{"next":{"node":{"fields":{"slug":"/labs/capstone"},"frontmatter":{"title":"Capstone","index":6}}},"slug":"/labs/forms-and-validation"}}