Skip to content

Commit

Permalink
feat: form validation across all browsers
Browse files Browse the repository at this point in the history
closes #253, #214, #252
  • Loading branch information
kaseybon authored and bryanbraun committed Oct 6, 2020
1 parent 74aa84e commit d4ed0bd
Show file tree
Hide file tree
Showing 9 changed files with 160 additions and 45 deletions.
74 changes: 56 additions & 18 deletions public/assets/js/scripts.js
@@ -1,9 +1,50 @@
/*!
* AnchorJS - v1.2.1 - 2015-07-02
* https://github.com/bryanbraun/anchorjs
* Copyright (c) 2015 Bryan Braun; Licensed MIT
*/
function AnchorJS(A){"use strict";this.options=A||{},this._applyRemainingDefaultOptions=function(A){this.options.icon=this.options.hasOwnProperty("icon")?A.icon:"",this.options.visible=this.options.hasOwnProperty("visible")?A.visible:"hover",this.options.placement=this.options.hasOwnProperty("placement")?A.placement:"right",this.options.class=this.options.hasOwnProperty("class")?A.class:""},this._applyRemainingDefaultOptions(A),this.add=function(A){var e,t,o,n,i,s,a,l,r,h,c,g;if(this._applyRemainingDefaultOptions(this.options),A){if("string"!=typeof A)throw new Error("The selector provided to AnchorJS was invalid.")}else A="h1, h2, h3, h4, h5, h6";if(e=document.querySelectorAll(A),0===e.length)return!1;for(this._addBaselineStyles(),t=document.querySelectorAll("[id]"),o=[].map.call(t,function(A){return A.id}),i=0;i<e.length;i++){if(e[i].hasAttribute("id"))n=e[i].getAttribute("id");else{s=e[i].textContent,a=s.replace(/[^\w\s-]/gi,"").replace(/\s+/g,"-").replace(/-{2,}/g,"-").substring(0,64).replace(/^-+|-+$/gm,"").toLowerCase(),h=a,r=0;do void 0!==l&&(h=a+"-"+r),l=o.indexOf(h),r+=1;while(-1!==l);l=void 0,o.push(h),e[i].setAttribute("id",h),n=h}c=n.replace(/-/g," "),g=document.createElement("a"),g.className="anchorjs-link "+this.options.class,g.href="#"+n,g.setAttribute("aria-label","Anchor link for: "+c),g.setAttribute("data-anchorjs-icon",this.options.icon),"always"===this.options.visible&&(g.style.opacity="1"),""===this.options.icon&&(g.style.fontFamily="anchorjs-icons",g.style.fontStyle="normal",g.style.fontVariant="normal",g.style.fontWeight="normal",g.style.lineHeight=1),"left"===this.options.placement?(g.style.position="absolute",g.style.marginLeft="-1em",g.style.paddingRight="0.5em",e[i].insertBefore(g,e[i].firstChild)):(g.style.paddingLeft="0.375em",e[i].appendChild(g))}return this},this.remove=function(A){for(var e,t=document.querySelectorAll(A),o=0;o<t.length;o++)e=t[o].querySelector(".anchorjs-link"),e&&t[o].removeChild(e);return this},this._addBaselineStyles=function(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style"),t=" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",o=" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",n=' @font-face { font-family: "anchorjs-icons"; font-style: normal; font-weight: normal; src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBTUAAAC8AAAAYGNtYXAWi9QdAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zgq29TcAAAF4AAABNGhlYWQEZM3pAAACrAAAADZoaGVhBhUDxgAAAuQAAAAkaG10eASAADEAAAMIAAAAFGxvY2EAKACuAAADHAAAAAxtYXhwAAgAVwAAAygAAAAgbmFtZQ5yJ3cAAANIAAAB2nBvc3QAAwAAAAAFJAAAACAAAwJAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpywPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6cv//f//AAAAAAAg6cv//f//AAH/4xY5AAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACADEARAJTAsAAKwBUAAABIiYnJjQ/AT4BMzIWFxYUDwEGIicmND8BNjQnLgEjIgYPAQYUFxYUBw4BIwciJicmND8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFA8BDgEjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAEAAAABAACiToc1Xw889QALBAAAAAAA0XnFFgAAAADRecUWAAAAAAJTAsAAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAAlMAAQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAACAAAAAoAAMQAAAAAACgAUAB4AmgABAAAABQBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIABwCfAAEAAAAAAAMADgBLAAEAAAAAAAQADgC0AAEAAAAAAAUACwAqAAEAAAAAAAYADgB1AAEAAAAAAAoAGgDeAAMAAQQJAAEAHAAOAAMAAQQJAAIADgCmAAMAAQQJAAMAHABZAAMAAQQJAAQAHADCAAMAAQQJAAUAFgA1AAMAAQQJAAYAHACDAAMAAQQJAAoANAD4YW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format("truetype"); }',i=" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }";e.className="anchorjs",e.appendChild(document.createTextNode("")),A=document.head.querySelector('[rel="stylesheet"], style'),void 0===A?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(t,e.sheet.cssRules.length),e.sheet.insertRule(o,e.sheet.cssRules.length),e.sheet.insertRule(i,e.sheet.cssRules.length),e.sheet.insertRule(n,e.sheet.cssRules.length)}}}var anchors=new AnchorJS;
var fieldValidation, validation;

fieldValidation = function(checkThis) {
var $checkThis, isValid;
isValid = true;
$checkThis = $(checkThis);
if ($.trim($checkThis.val()).length) {
$checkThis.removeClass('invalid');
} else {
isValid = false;
$checkThis.addClass('invalid');
}
return isValid;
};

validation = function() {
$('form').submit(function() {
var $inputs, isValid;
isValid = true;
$inputs = $(this).find('[required]');
$inputs.each(function() {
var $input;
$input = $(this);
if (!fieldValidation($input)) {
isValid = false;
}
return true;
});
if (!isValid) {
return false;
}
});
$('form *').focusout(function() {
return fieldValidation(this);
});
return $('input[type="radio"]').on('click', function(e) {
if ($('#compensation_no').is(':checked')) {
$('#compensation_no').addClass('invalid');
$('#compensation_alert').removeClass('hidden');
return $('#submit_form').attr('disabled', 'disabled');
} else {
$('#compensation_no').removeClass('invalid');
$('#compensation_alert').addClass('hidden');
return $('#submit_form').removeAttr('disabled');
}
});
};

var Apprenticeship, Apprenticeships;

Expand Down Expand Up @@ -75,7 +116,7 @@ Apprenticeships = (function() {

})();

$(function() {
$(document).ready(function() {
var apprenticeships, list;
list = [];
$('.js-apprenticeship').each(function() {
Expand All @@ -88,19 +129,16 @@ $(function() {
} else {
event.returnValue = false;
}
console.log("you clicked");
$('.category__item.is-active').removeClass('is-active');
$(this).addClass('is-active');
return apprenticeships.filter($(this).data('filters'));
});
return $('input[type="radio"]').on('click', function(e) {
console.log("clicked");
if ($('#compensation_no').is(':checked')) {
$('#compensation_alert').removeClass('hidden');
return $('#submit_form').attr('disabled', 'disabled');
} else {
$('#compensation_alert').addClass('hidden');
return $('#submit_form').removeAttr('disabled');
}
});
return validation();
});

/*!
* AnchorJS - v1.2.1 - 2015-07-02
* https://github.com/bryanbraun/anchorjs
* Copyright (c) 2015 Bryan Braun; Licensed MIT
*/
function AnchorJS(A){"use strict";this.options=A||{},this._applyRemainingDefaultOptions=function(A){this.options.icon=this.options.hasOwnProperty("icon")?A.icon:"",this.options.visible=this.options.hasOwnProperty("visible")?A.visible:"hover",this.options.placement=this.options.hasOwnProperty("placement")?A.placement:"right",this.options.class=this.options.hasOwnProperty("class")?A.class:""},this._applyRemainingDefaultOptions(A),this.add=function(A){var e,t,o,n,i,s,a,l,r,h,c,g;if(this._applyRemainingDefaultOptions(this.options),A){if("string"!=typeof A)throw new Error("The selector provided to AnchorJS was invalid.")}else A="h1, h2, h3, h4, h5, h6";if(e=document.querySelectorAll(A),0===e.length)return!1;for(this._addBaselineStyles(),t=document.querySelectorAll("[id]"),o=[].map.call(t,function(A){return A.id}),i=0;i<e.length;i++){if(e[i].hasAttribute("id"))n=e[i].getAttribute("id");else{s=e[i].textContent,a=s.replace(/[^\w\s-]/gi,"").replace(/\s+/g,"-").replace(/-{2,}/g,"-").substring(0,64).replace(/^-+|-+$/gm,"").toLowerCase(),h=a,r=0;do void 0!==l&&(h=a+"-"+r),l=o.indexOf(h),r+=1;while(-1!==l);l=void 0,o.push(h),e[i].setAttribute("id",h),n=h}c=n.replace(/-/g," "),g=document.createElement("a"),g.className="anchorjs-link "+this.options.class,g.href="#"+n,g.setAttribute("aria-label","Anchor link for: "+c),g.setAttribute("data-anchorjs-icon",this.options.icon),"always"===this.options.visible&&(g.style.opacity="1"),""===this.options.icon&&(g.style.fontFamily="anchorjs-icons",g.style.fontStyle="normal",g.style.fontVariant="normal",g.style.fontWeight="normal",g.style.lineHeight=1),"left"===this.options.placement?(g.style.position="absolute",g.style.marginLeft="-1em",g.style.paddingRight="0.5em",e[i].insertBefore(g,e[i].firstChild)):(g.style.paddingLeft="0.375em",e[i].appendChild(g))}return this},this.remove=function(A){for(var e,t=document.querySelectorAll(A),o=0;o<t.length;o++)e=t[o].querySelector(".anchorjs-link"),e&&t[o].removeChild(e);return this},this._addBaselineStyles=function(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style"),t=" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",o=" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",n=' @font-face { font-family: "anchorjs-icons"; font-style: normal; font-weight: normal; src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBTUAAAC8AAAAYGNtYXAWi9QdAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zgq29TcAAAF4AAABNGhlYWQEZM3pAAACrAAAADZoaGVhBhUDxgAAAuQAAAAkaG10eASAADEAAAMIAAAAFGxvY2EAKACuAAADHAAAAAxtYXhwAAgAVwAAAygAAAAgbmFtZQ5yJ3cAAANIAAAB2nBvc3QAAwAAAAAFJAAAACAAAwJAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpywPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6cv//f//AAAAAAAg6cv//f//AAH/4xY5AAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACADEARAJTAsAAKwBUAAABIiYnJjQ/AT4BMzIWFxYUDwEGIicmND8BNjQnLgEjIgYPAQYUFxYUBw4BIwciJicmND8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFA8BDgEjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAEAAAABAACiToc1Xw889QALBAAAAAAA0XnFFgAAAADRecUWAAAAAAJTAsAAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAAlMAAQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAACAAAAAoAAMQAAAAAACgAUAB4AmgABAAAABQBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIABwCfAAEAAAAAAAMADgBLAAEAAAAAAAQADgC0AAEAAAAAAAUACwAqAAEAAAAAAAYADgB1AAEAAAAAAAoAGgDeAAMAAQQJAAEAHAAOAAMAAQQJAAIADgCmAAMAAQQJAAMAHABZAAMAAQQJAAQAHADCAAMAAQQJAAUAFgA1AAMAAQQJAAYAHACDAAMAAQQJAAoANAD4YW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format("truetype"); }',i=" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }";e.className="anchorjs",e.appendChild(document.createTextNode("")),A=document.head.querySelector('[rel="stylesheet"], style'),void 0===A?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(t,e.sheet.cssRules.length),e.sheet.insertRule(o,e.sheet.cssRules.length),e.sheet.insertRule(i,e.sheet.cssRules.length),e.sheet.insertRule(n,e.sheet.cssRules.length)}}}var anchors=new AnchorJS;
13 changes: 2 additions & 11 deletions source/coffee/app.coffee
Expand Up @@ -50,9 +50,8 @@ class Apprenticeships

visibleList[visibleList.length - 1].addLastClass()


# jQuery time on DOM ready
$ ->
$(document).ready ->
list = []
# Iterates through each apprenticeship in the DOM and instantiates it into a list
$('.js-apprenticeship').each ->
Expand All @@ -68,19 +67,11 @@ $ ->
else
event.returnValue = false

console.log "you clicked"
# Adds and removes active state on filter buttons
$('.category__item.is-active').removeClass('is-active')
$(@).addClass('is-active')

# Filters visible apprenticeships based on the data attribute of clicked button
apprenticeships.filter($(@).data('filters'))

$('input[type="radio"]').on 'click', (e) ->
console.log "clicked"
if $('#compensation_no').is(':checked')
$('#compensation_alert').removeClass('hidden')
$('#submit_form').attr('disabled','disabled')
else
$('#compensation_alert').addClass('hidden')
$('#submit_form').removeAttr('disabled')
validation()
35 changes: 35 additions & 0 deletions source/coffee/validation.coffee
@@ -0,0 +1,35 @@
fieldValidation = (checkThis) ->
isValid = true;
$checkThis = $(checkThis)

if $.trim($checkThis.val()).length
$checkThis.removeClass('invalid')
else
isValid = false
$checkThis.addClass('invalid')
return isValid

validation = ->
$('form').submit ->
isValid = true
$inputs = $(this).find('[required]')
$inputs.each ->
$input = $(this)
if !fieldValidation($input)
isValid = false
return true
if !isValid
return false

$('form *').focusout ->
fieldValidation(this)

$('input[type="radio"]').on 'click', (e) ->
if $('#compensation_no').is(':checked')
$('#compensation_no').addClass('invalid')
$('#compensation_alert').removeClass('hidden')
$('#submit_form').attr('disabled','disabled')
else
$('#compensation_no').removeClass('invalid')
$('#compensation_alert').addClass('hidden')
$('#submit_form').removeAttr('disabled')
9 changes: 7 additions & 2 deletions source/data/data.yml
Expand Up @@ -234,7 +234,6 @@ submit:
name: category
id: category
categories:
- item: Select One
- item: Development
- item: Design
- item: Software
Expand All @@ -259,11 +258,17 @@ submit:
type: url
placeholder: http://
email:
label: Email
label: Your Email
name: email
id: email
type: email
placeholder: you@example.com
referral:
label: Past Apprentice Email
name: apprentice
id: apprentice
type: email
placeholder: apprentice@example.com
button:
text: Submit
type: submit
Expand Down
14 changes: 2 additions & 12 deletions source/js/app.js
Expand Up @@ -68,7 +68,7 @@ Apprenticeships = (function() {

})();

$(function() {
$(document).ready(function() {
var apprenticeships, list;
list = [];
$('.js-apprenticeship').each(function() {
Expand All @@ -81,19 +81,9 @@ $(function() {
} else {
event.returnValue = false;
}
console.log("you clicked");
$('.category__item.is-active').removeClass('is-active');
$(this).addClass('is-active');
return apprenticeships.filter($(this).data('filters'));
});
return $('input[type="radio"]').on('click', function(e) {
console.log("clicked");
if ($('#compensation_no').is(':checked')) {
$('#compensation_alert').removeClass('hidden');
return $('#submit_form').attr('disabled', 'disabled');
} else {
$('#compensation_alert').addClass('hidden');
return $('#submit_form').removeAttr('disabled');
}
});
return validation();
});
47 changes: 47 additions & 0 deletions source/js/validation.js
@@ -0,0 +1,47 @@
var fieldValidation, validation;

fieldValidation = function(checkThis) {
var $checkThis, isValid;
isValid = true;
$checkThis = $(checkThis);
if ($.trim($checkThis.val()).length) {
$checkThis.removeClass('invalid');
} else {
isValid = false;
$checkThis.addClass('invalid');
}
return isValid;
};

validation = function() {
$('form').submit(function() {
var $inputs, isValid;
isValid = true;
$inputs = $(this).find('[required]');
$inputs.each(function() {
var $input;
$input = $(this);
if (!fieldValidation($input)) {
isValid = false;
}
return true;
});
if (!isValid) {
return false;
}
});
$('form *').focusout(function() {
return fieldValidation(this);
});
return $('input[type="radio"]').on('click', function(e) {
if ($('#compensation_no').is(':checked')) {
$('#compensation_no').addClass('invalid');
$('#compensation_alert').removeClass('hidden');
return $('#submit_form').attr('disabled', 'disabled');
} else {
$('#compensation_no').removeClass('invalid');
$('#compensation_alert').addClass('hidden');
return $('#submit_form').removeAttr('disabled');
}
});
};
3 changes: 3 additions & 0 deletions source/scss/modules/_form.scss
Expand Up @@ -26,6 +26,9 @@
outline: none;
transition: border .5s;
}
&.invalid {
border-color: $c--rust;
}
}
.form__select,
.form__number {
Expand Down
1 change: 1 addition & 0 deletions source/templates/layouts/default.hbs
Expand Up @@ -47,6 +47,7 @@

<script src="{{ assets }}/js/scripts.js"></script>
<script>
var anchors
anchors.options = {
visible: 'always',
placement: 'left',
Expand Down
9 changes: 7 additions & 2 deletions source/templates/partials/_form.hbs
Expand Up @@ -16,7 +16,8 @@

<section class="wrapper grid__item grid__item--two-quarters">
<label class="form__label" for="{{ submit.form.category.id }}">{{ submit.form.category.label }}</label>
<select class="form__select" name="{{ submit.form.category.name }}">
<select class="form__select" name="{{ submit.form.category.name }}" required>
<option value="" disabled selected>Select One</option>
{{#forEach submit.form.category.categories}}
<option value="{{ item }}">{{ item }}</option>
{{/forEach}}
Expand All @@ -25,7 +26,7 @@

<section class="grid__item grid__item--two-quarters form__section">
<label class="form__label" for="{{ submit.form.duration.id }}">{{ submit.form.duration.label }}</label>
<input class="form__number" type="{{ submit.form.duration.type }}" name="{{ submit.form.duration.name }}" id="{{ submit.form.duration.id }}" value="3" validate required>
<input class="form__number" type="{{ submit.form.duration.type }}" name="{{ submit.form.duration.name }}" id="{{ submit.form.duration.id }}" placeholder="3" validate required>
</section>

<label class="form__label" for="{{ submit.form.summary.id }}">{{ submit.form.summary.label }}</label>
Expand All @@ -38,6 +39,10 @@
<label class="form__label" for="{{ submit.form.learn_more.id }}">{{ submit.form.learn_more.label }}</label>
<input class="form__input" type="{{ submit.form.learn_more.type }}" name="{{ submit.form.learn_more.name }}" id="{{ submit.form.learn_more.id }}" placeholder="{{ submit.form.learn_more.placeholder }}" validate required>

<label class="form__label" for="{{ submit.form.referral.id }}">{{ submit.form.referral.label }}</label>
<input class="form__input" type="{{ submit.form.referral.type }}" name="{{ submit.form.referral.name }}" id="{{ submit.form.referral.id }}" placeholder="{{ submit.form.referral.placeholder }}" validate required>
<span class="helper">In order to effectively evaluate your listing, we would like to ask a graduate of your apprenticeship about their experience.</span>

<label class="form__label" for="{{ submit.form.email.id }}">{{ submit.form.email.label }}</label>
<input class="form__input" type="{{ submit.form.email.type }}" name="{{ submit.form.email.name }}" id="{{ submit.form.email.id }}" placeholder="{{ submit.form.email.placeholder }}" validate required>

Expand Down

0 comments on commit d4ed0bd

Please sign in to comment.