public/lib/stub-form-validation.ts (72 lines of code) (raw):

import { ContentType, Stub } from "./model/stub"; const MESSAGING = { commissionLengthRequired: "A commissioned length is required", commissionLengthMinimum: "Commissioned length must be greater than zero" }; const doesContentTypeRequireCommissionedLength = (contentType: ContentType) => { switch (contentType) { case "liveblog": case "gallery": case "picture": case "video": case "audio": return false; case "article": case "interactive": case "keyTakeaways": case "qAndA": case "timeline": case "miniProfiles": case "multiByline": default: return true; } }; const stubIsMissingRequiredLength = (stub: Stub) => doesContentTypeRequireCommissionedLength(stub.contentType) && !stub.commissionedLength && !stub.missingCommissionedLengthReason; const stubHasInvalidCommissionedLength = (stub: Stub) => doesContentTypeRequireCommissionedLength(stub.contentType) && stub.commissionedLength && stub.commissionedLength <= 0; const generateErrorMessages = (stub: Stub): string[] | undefined => { const errors: string[] = []; if (stubIsMissingRequiredLength(stub)) { errors.push(MESSAGING.commissionLengthRequired); } if(stubHasInvalidCommissionedLength(stub)) { errors.push(MESSAGING.commissionLengthMinimum); } return errors.length > 0 ? errors : undefined; }; const useNativeFormFeedback = (stub: Stub) => { const formElement = document.querySelector<HTMLFormElement>( "form[name=stubForm]" ); if (!formElement) { return; } const commissionedLengthInput = formElement.querySelector<HTMLInputElement>( "input[name=commissionedLength]" ); if (commissionedLengthInput) { if (stubIsMissingRequiredLength(stub)) { commissionedLengthInput.setCustomValidity( MESSAGING.commissionLengthRequired ); } else if(stubHasInvalidCommissionedLength(stub)) { commissionedLengthInput.setCustomValidity( MESSAGING.commissionLengthMinimum ); } else { commissionedLengthInput.setCustomValidity(""); } } formElement.reportValidity(); }; export { generateErrorMessages, doesContentTypeRequireCommissionedLength, useNativeFormFeedback, };