Repository files navigation

ValidatedForms

NPM repo: https://www.npmjs.com/package/@tkdaj/react-validated-form

bugs can be reported to: tkdaj.packages@gmail.com

This project includes both a ValidatedReduxForm and a regular ValidatedForm. The purpose of both is to take the headache out of validating forms for you! All you need to do is use one of these components instead of a regular <form> tag, and use standard html validation on your fields (like required, pattern, min, max, etc) and the component keeps track of your errors for you. You can also add custom error messages and a custom function for validation logic per field. The only standard form property this component doesn't accept is "onSubmit". That is because it has it's own onSubmit function, and after validating the data, it will either fire the onValidSubmissionAttempt or the onInvalidSubmissionAttempt.

Here is an example:

import{ValidatedReduxForm}from'@tkdaj/react-validated-form';import{TextField}from'@material-ui/core';<ValidatedReduxFormname="testForm"noValidatecustomValidators={{input1: {errorText: "Please enter a valid number."},theradios: {errorText: "You messed up. The correct answer is 3!",isValid: (e)=>e.taget.value==='3'},}}onValidSubmissionAttempt={(e,formValues)=>{console.log("valid submission",formValues);}}onInvalidSubmissionAttempt={(e,formValues)=>{console.log("invalid submission",formValues);}}><inputchecked={this.state.thecheckbox}onChange={e=>this.setState({thecheckbox: e.target.checked})}name="thecheckbox"type="checkbox"required/><labelhtmlFor="theradios"><inputchecked={this.state.theradios==='1'}onChange={e=>this.setState({theradios: e.target.value})}id="theradios"name="theradios"requiredtype="radio"value="1"/><inputchecked={this.state.theradios==='2'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="2"/><inputchecked={this.state.theradios==='3'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="3"/></label><TextFieldname="input1"value={this.state.input1}onChange={e=>this.setState({input1: e.target.value})}margin="dense"label="Input 1"type="text"requiredinputProps={{pattern: '\\d+'}}/><labelhtmlFor="theselect">Dropdown</label><selectvalue={this.state.theselect}onChange={e=>this.setState({theselect: e.target.value})}onBlur={e=>this.setState({theselect: e.target.value})}requiredname="theselect"id="theselect"><optionvalue="">Default</option><optionvalue="1">1</option><optionvalue="2">2</option><optionvalue="3">3</option></select><buttontype="submit">Submit</button><buttononClick={this.formRef?.current?.resetFormSubmitted}type="button">Resetformsubmittedvalue</button><ValidatedReduxForm/>

API

All regular attributes which can be applied to a form work here too except for onSubmit

name: required for the form as well as ALL validatable fields -- If you do not have a name on a field, you will get a warning logged to your console. Since sometimes it is difficult or impossible to add a name to a field (when using third party libraries), the next prop is available to mute those warnings.

onInvalidSubmissionAttempt: If a submission is attempted, but it is invalid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

onValidSubmissionAttempt: If a submission is attempted, and it is valid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

hideNameWarningsoptional as described in the name section of this API, names are required, so you will get a warning logged to the console if one of your fields is missing a name by default. You can turn this off by setting hideNameWarnings to true.

formErrorClass: optional Specific error class to be applied to the entire form

customValidators: optional An object which can contain custom error messages or validation logic within an isValid function. It should be shaped like this:

customValidators: {[fieldName: string]: {isValid?: (value: any)=>boolean;errorText?: string;};};

If you don't supply any custom error text, then the default HTML5 error text will be used.


onFormChanged: optional[ValidatedForm ONLY] It fires any time a form value is changed and the function is shaped as follows:

 onFormChanged?: (updatedField: HTMLFormElement,updatedFormState: IValidatedFormState)=>void;

Data Structure

A single form follows the shape shown in IValidatedFormState shown here:

exportinterfaceIValidatedFormState{submissionAttempted: boolean;formIsValid: boolean;formValues: FormValues;}exporttypeFormValues={[fieldName: string]: {value: any;error: string;};};

Using Without Redux

To use the standard ValidatedForm without redux, you use it in place of a normal <form> tag. Since the non-redux form does not have access to a global store to store the validated data in, there are 2 methods specifically added to ValidatedForm which are meant to be accessed from outside the form: getFormData and resetFormSubmitted In order to access these, create a ref object using React.createRef() or the useRef(null) hook. Then, add the created ref to your ValidatedForm like:

import{ValidatedForm}from'@tkdaj/react-validated-form';<ValidatedFormname="myForm"ref={this.myFormRef}/>;

Once you have done that you can access the function using the ref. For example: this.myFormRef.current.getFormData() or this.myFormRef.current.resetFormSubmitted()

Using With Redux

Since all of the form data is stored inside redux with this component, there is no need for an accessible getFormData function as shown in the "Using Without Redux" section above, but resetFormSubmitted is still publicly available. In order to access it use a ref as shown in the instructions above under "Using Without Redux". For simplicity, all forms are stored inside redux under the name: validatedForms. If you want to get data from a form it will be validatedForms.myFormName where myFormName is the name of one of your ValidatedReduxForms. The only boilerplate you need to do to set this up other than using the component is:

import{validatedForms}from'@tkdaj/react-validated-form';// important! You must use the name 'validatedForms' when adding it to your store otherwise the ValidatedReduxForm component won't be able to update the proper values

In the case of both redux and non-redux forms you should store the form field's values and set their onChange like normal. See src/Demo/ReduxFormDemo.tsx or src/Demo/StandardFormDemo.tsx for more information.

About

A simple form component which automatically validates all elements within itself. There are two versions - one to be used with just React, and another to be used to React and Redux

Topics

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ValidatedForms

NPM repo: https://www.npmjs.com/package/@tkdaj/react-validated-form

bugs can be reported to: tkdaj.packages@gmail.com

This project includes both a ValidatedReduxForm and a regular ValidatedForm. The purpose of both is to take the headache out of validating forms for you! All you need to do is use one of these components instead of a regular <form> tag, and use standard html validation on your fields (like required, pattern, min, max, etc) and the component keeps track of your errors for you. You can also add custom error messages and a custom function for validation logic per field. The only standard form property this component doesn't accept is "onSubmit". That is because it has it's own onSubmit function, and after validating the data, it will either fire the onValidSubmissionAttempt or the onInvalidSubmissionAttempt.

Here is an example:

import{ValidatedReduxForm}from'@tkdaj/react-validated-form';import{TextField}from'@material-ui/core';<ValidatedReduxFormname="testForm"noValidatecustomValidators={{input1: {errorText: "Please enter a valid number."},theradios: {errorText: "You messed up. The correct answer is 3!",isValid: (e)=>e.taget.value==='3'},}}onValidSubmissionAttempt={(e,formValues)=>{console.log("valid submission",formValues);}}onInvalidSubmissionAttempt={(e,formValues)=>{console.log("invalid submission",formValues);}}><inputchecked={this.state.thecheckbox}onChange={e=>this.setState({thecheckbox: e.target.checked})}name="thecheckbox"type="checkbox"required/><labelhtmlFor="theradios"><inputchecked={this.state.theradios==='1'}onChange={e=>this.setState({theradios: e.target.value})}id="theradios"name="theradios"requiredtype="radio"value="1"/><inputchecked={this.state.theradios==='2'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="2"/><inputchecked={this.state.theradios==='3'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="3"/></label><TextFieldname="input1"value={this.state.input1}onChange={e=>this.setState({input1: e.target.value})}margin="dense"label="Input 1"type="text"requiredinputProps={{pattern: '\\d+'}}/><labelhtmlFor="theselect">Dropdown</label><selectvalue={this.state.theselect}onChange={e=>this.setState({theselect: e.target.value})}onBlur={e=>this.setState({theselect: e.target.value})}requiredname="theselect"id="theselect"><optionvalue="">Default</option><optionvalue="1">1</option><optionvalue="2">2</option><optionvalue="3">3</option></select><buttontype="submit">Submit</button><buttononClick={this.formRef?.current?.resetFormSubmitted}type="button">Resetformsubmittedvalue</button><ValidatedReduxForm/>

API

All regular attributes which can be applied to a form work here too except for onSubmit

name: required for the form as well as ALL validatable fields -- If you do not have a name on a field, you will get a warning logged to your console. Since sometimes it is difficult or impossible to add a name to a field (when using third party libraries), the next prop is available to mute those warnings.

onInvalidSubmissionAttempt: If a submission is attempted, but it is invalid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

onValidSubmissionAttempt: If a submission is attempted, and it is valid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

hideNameWarningsoptional as described in the name section of this API, names are required, so you will get a warning logged to the console if one of your fields is missing a name by default. You can turn this off by setting hideNameWarnings to true.

formErrorClass: optional Specific error class to be applied to the entire form

customValidators: optional An object which can contain custom error messages or validation logic within an isValid function. It should be shaped like this:

customValidators: {[fieldName: string]: {isValid?: (value: any)=>boolean;errorText?: string;};};

If you don't supply any custom error text, then the default HTML5 error text will be used.


onFormChanged: optional[ValidatedForm ONLY] It fires any time a form value is changed and the function is shaped as follows:

 onFormChanged?: (updatedField: HTMLFormElement,updatedFormState: IValidatedFormState)=>void;

Data Structure

A single form follows the shape shown in IValidatedFormState shown here:

exportinterfaceIValidatedFormState{submissionAttempted: boolean;formIsValid: boolean;formValues: FormValues;}exporttypeFormValues={[fieldName: string]: {value: any;error: string;};};

Using Without Redux

To use the standard ValidatedForm without redux, you use it in place of a normal <form> tag. Since the non-redux form does not have access to a global store to store the validated data in, there are 2 methods specifically added to ValidatedForm which are meant to be accessed from outside the form: getFormData and resetFormSubmitted In order to access these, create a ref object using React.createRef() or the useRef(null) hook. Then, add the created ref to your ValidatedForm like:

import{ValidatedForm}from'@tkdaj/react-validated-form';<ValidatedFormname="myForm"ref={this.myFormRef}/>;

Once you have done that you can access the function using the ref. For example: this.myFormRef.current.getFormData() or this.myFormRef.current.resetFormSubmitted()

Using With Redux

Since all of the form data is stored inside redux with this component, there is no need for an accessible getFormData function as shown in the "Using Without Redux" section above, but resetFormSubmitted is still publicly available. In order to access it use a ref as shown in the instructions above under "Using Without Redux". For simplicity, all forms are stored inside redux under the name: validatedForms. If you want to get data from a form it will be validatedForms.myFormName where myFormName is the name of one of your ValidatedReduxForms. The only boilerplate you need to do to set this up other than using the component is:

import{validatedForms}from'@tkdaj/react-validated-form';// important! You must use the name 'validatedForms' when adding it to your store otherwise the ValidatedReduxForm component won't be able to update the proper values

In the case of both redux and non-redux forms you should store the form field's values and set their onChange like normal. See src/Demo/ReduxFormDemo.tsx or src/Demo/StandardFormDemo.tsx for more information.

About

A simple form component which automatically validates all elements within itself. There are two versions - one to be used with just React, and another to be used to React and Redux

Topics

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ValidatedForms

NPM repo: https://www.npmjs.com/package/@tkdaj/react-validated-form

bugs can be reported to: tkdaj.packages@gmail.com

This project includes both a ValidatedReduxForm and a regular ValidatedForm. The purpose of both is to take the headache out of validating forms for you! All you need to do is use one of these components instead of a regular <form> tag, and use standard html validation on your fields (like required, pattern, min, max, etc) and the component keeps track of your errors for you. You can also add custom error messages and a custom function for validation logic per field. The only standard form property this component doesn't accept is "onSubmit". That is because it has it's own onSubmit function, and after validating the data, it will either fire the onValidSubmissionAttempt or the onInvalidSubmissionAttempt.

Here is an example:

import{ValidatedReduxForm}from'@tkdaj/react-validated-form';import{TextField}from'@material-ui/core';<ValidatedReduxFormname="testForm"noValidatecustomValidators={{input1: {errorText: "Please enter a valid number."},theradios: {errorText: "You messed up. The correct answer is 3!",isValid: (e)=>e.taget.value==='3'},}}onValidSubmissionAttempt={(e,formValues)=>{console.log("valid submission",formValues);}}onInvalidSubmissionAttempt={(e,formValues)=>{console.log("invalid submission",formValues);}}><inputchecked={this.state.thecheckbox}onChange={e=>this.setState({thecheckbox: e.target.checked})}name="thecheckbox"type="checkbox"required/><labelhtmlFor="theradios"><inputchecked={this.state.theradios==='1'}onChange={e=>this.setState({theradios: e.target.value})}id="theradios"name="theradios"requiredtype="radio"value="1"/><inputchecked={this.state.theradios==='2'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="2"/><inputchecked={this.state.theradios==='3'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="3"/></label><TextFieldname="input1"value={this.state.input1}onChange={e=>this.setState({input1: e.target.value})}margin="dense"label="Input 1"type="text"requiredinputProps={{pattern: '\\d+'}}/><labelhtmlFor="theselect">Dropdown</label><selectvalue={this.state.theselect}onChange={e=>this.setState({theselect: e.target.value})}onBlur={e=>this.setState({theselect: e.target.value})}requiredname="theselect"id="theselect"><optionvalue="">Default</option><optionvalue="1">1</option><optionvalue="2">2</option><optionvalue="3">3</option></select><buttontype="submit">Submit</button><buttononClick={this.formRef?.current?.resetFormSubmitted}type="button">Resetformsubmittedvalue</button><ValidatedReduxForm/>

API

All regular attributes which can be applied to a form work here too except for onSubmit

name: required for the form as well as ALL validatable fields -- If you do not have a name on a field, you will get a warning logged to your console. Since sometimes it is difficult or impossible to add a name to a field (when using third party libraries), the next prop is available to mute those warnings.

onInvalidSubmissionAttempt: If a submission is attempted, but it is invalid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

onValidSubmissionAttempt: If a submission is attempted, and it is valid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

hideNameWarningsoptional as described in the name section of this API, names are required, so you will get a warning logged to the console if one of your fields is missing a name by default. You can turn this off by setting hideNameWarnings to true.

formErrorClass: optional Specific error class to be applied to the entire form

customValidators: optional An object which can contain custom error messages or validation logic within an isValid function. It should be shaped like this:

customValidators: {[fieldName: string]: {isValid?: (value: any)=>boolean;errorText?: string;};};

If you don't supply any custom error text, then the default HTML5 error text will be used.


onFormChanged: optional[ValidatedForm ONLY] It fires any time a form value is changed and the function is shaped as follows:

 onFormChanged?: (updatedField: HTMLFormElement,updatedFormState: IValidatedFormState)=>void;

Data Structure

A single form follows the shape shown in IValidatedFormState shown here:

exportinterfaceIValidatedFormState{submissionAttempted: boolean;formIsValid: boolean;formValues: FormValues;}exporttypeFormValues={[fieldName: string]: {value: any;error: string;};};

Using Without Redux

To use the standard ValidatedForm without redux, you use it in place of a normal <form> tag. Since the non-redux form does not have access to a global store to store the validated data in, there are 2 methods specifically added to ValidatedForm which are meant to be accessed from outside the form: getFormData and resetFormSubmitted In order to access these, create a ref object using React.createRef() or the useRef(null) hook. Then, add the created ref to your ValidatedForm like:

import{ValidatedForm}from'@tkdaj/react-validated-form';<ValidatedFormname="myForm"ref={this.myFormRef}/>;

Once you have done that you can access the function using the ref. For example: this.myFormRef.current.getFormData() or this.myFormRef.current.resetFormSubmitted()

Using With Redux

Since all of the form data is stored inside redux with this component, there is no need for an accessible getFormData function as shown in the "Using Without Redux" section above, but resetFormSubmitted is still publicly available. In order to access it use a ref as shown in the instructions above under "Using Without Redux". For simplicity, all forms are stored inside redux under the name: validatedForms. If you want to get data from a form it will be validatedForms.myFormName where myFormName is the name of one of your ValidatedReduxForms. The only boilerplate you need to do to set this up other than using the component is:

import{validatedForms}from'@tkdaj/react-validated-form';// important! You must use the name 'validatedForms' when adding it to your store otherwise the ValidatedReduxForm component won't be able to update the proper values

In the case of both redux and non-redux forms you should store the form field's values and set their onChange like normal. See src/Demo/ReduxFormDemo.tsx or src/Demo/StandardFormDemo.tsx for more information.

About

A simple form component which automatically validates all elements within itself. There are two versions - one to be used with just React, and another to be used to React and Redux

Topics

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ValidatedForms

NPM repo: https://www.npmjs.com/package/@tkdaj/react-validated-form

bugs can be reported to: tkdaj.packages@gmail.com

This project includes both a ValidatedReduxForm and a regular ValidatedForm. The purpose of both is to take the headache out of validating forms for you! All you need to do is use one of these components instead of a regular <form> tag, and use standard html validation on your fields (like required, pattern, min, max, etc) and the component keeps track of your errors for you. You can also add custom error messages and a custom function for validation logic per field. The only standard form property this component doesn't accept is "onSubmit". That is because it has it's own onSubmit function, and after validating the data, it will either fire the onValidSubmissionAttempt or the onInvalidSubmissionAttempt.

Here is an example:

import{ValidatedReduxForm}from'@tkdaj/react-validated-form';import{TextField}from'@material-ui/core';<ValidatedReduxFormname="testForm"noValidatecustomValidators={{input1: {errorText: "Please enter a valid number."},theradios: {errorText: "You messed up. The correct answer is 3!",isValid: (e)=>e.taget.value==='3'},}}onValidSubmissionAttempt={(e,formValues)=>{console.log("valid submission",formValues);}}onInvalidSubmissionAttempt={(e,formValues)=>{console.log("invalid submission",formValues);}}><inputchecked={this.state.thecheckbox}onChange={e=>this.setState({thecheckbox: e.target.checked})}name="thecheckbox"type="checkbox"required/><labelhtmlFor="theradios"><inputchecked={this.state.theradios==='1'}onChange={e=>this.setState({theradios: e.target.value})}id="theradios"name="theradios"requiredtype="radio"value="1"/><inputchecked={this.state.theradios==='2'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="2"/><inputchecked={this.state.theradios==='3'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="3"/></label><TextFieldname="input1"value={this.state.input1}onChange={e=>this.setState({input1: e.target.value})}margin="dense"label="Input 1"type="text"requiredinputProps={{pattern: '\\d+'}}/><labelhtmlFor="theselect">Dropdown</label><selectvalue={this.state.theselect}onChange={e=>this.setState({theselect: e.target.value})}onBlur={e=>this.setState({theselect: e.target.value})}requiredname="theselect"id="theselect"><optionvalue="">Default</option><optionvalue="1">1</option><optionvalue="2">2</option><optionvalue="3">3</option></select><buttontype="submit">Submit</button><buttononClick={this.formRef?.current?.resetFormSubmitted}type="button">Resetformsubmittedvalue</button><ValidatedReduxForm/>

API

All regular attributes which can be applied to a form work here too except for onSubmit

name: required for the form as well as ALL validatable fields -- If you do not have a name on a field, you will get a warning logged to your console. Since sometimes it is difficult or impossible to add a name to a field (when using third party libraries), the next prop is available to mute those warnings.

onInvalidSubmissionAttempt: If a submission is attempted, but it is invalid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

onValidSubmissionAttempt: If a submission is attempted, and it is valid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

hideNameWarningsoptional as described in the name section of this API, names are required, so you will get a warning logged to the console if one of your fields is missing a name by default. You can turn this off by setting hideNameWarnings to true.

formErrorClass: optional Specific error class to be applied to the entire form

customValidators: optional An object which can contain custom error messages or validation logic within an isValid function. It should be shaped like this:

customValidators: {[fieldName: string]: {isValid?: (value: any)=>boolean;errorText?: string;};};

If you don't supply any custom error text, then the default HTML5 error text will be used.


onFormChanged: optional[ValidatedForm ONLY] It fires any time a form value is changed and the function is shaped as follows:

 onFormChanged?: (updatedField: HTMLFormElement,updatedFormState: IValidatedFormState)=>void;

Data Structure

A single form follows the shape shown in IValidatedFormState shown here:

exportinterfaceIValidatedFormState{submissionAttempted: boolean;formIsValid: boolean;formValues: FormValues;}exporttypeFormValues={[fieldName: string]: {value: any;error: string;};};

Using Without Redux

To use the standard ValidatedForm without redux, you use it in place of a normal <form> tag. Since the non-redux form does not have access to a global store to store the validated data in, there are 2 methods specifically added to ValidatedForm which are meant to be accessed from outside the form: getFormData and resetFormSubmitted In order to access these, create a ref object using React.createRef() or the useRef(null) hook. Then, add the created ref to your ValidatedForm like:

import{ValidatedForm}from'@tkdaj/react-validated-form';<ValidatedFormname="myForm"ref={this.myFormRef}/>;

Once you have done that you can access the function using the ref. For example: this.myFormRef.current.getFormData() or this.myFormRef.current.resetFormSubmitted()

Using With Redux

Since all of the form data is stored inside redux with this component, there is no need for an accessible getFormData function as shown in the "Using Without Redux" section above, but resetFormSubmitted is still publicly available. In order to access it use a ref as shown in the instructions above under "Using Without Redux". For simplicity, all forms are stored inside redux under the name: validatedForms. If you want to get data from a form it will be validatedForms.myFormName where myFormName is the name of one of your ValidatedReduxForms. The only boilerplate you need to do to set this up other than using the component is:

import{validatedForms}from'@tkdaj/react-validated-form';// important! You must use the name 'validatedForms' when adding it to your store otherwise the ValidatedReduxForm component won't be able to update the proper values

In the case of both redux and non-redux forms you should store the form field's values and set their onChange like normal. See src/Demo/ReduxFormDemo.tsx or src/Demo/StandardFormDemo.tsx for more information.

About

A simple form component which automatically validates all elements within itself. There are two versions - one to be used with just React, and another to be used to React and Redux

Topics

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ValidatedForms

NPM repo: https://www.npmjs.com/package/@tkdaj/react-validated-form

bugs can be reported to: tkdaj.packages@gmail.com

This project includes both a ValidatedReduxForm and a regular ValidatedForm. The purpose of both is to take the headache out of validating forms for you! All you need to do is use one of these components instead of a regular <form> tag, and use standard html validation on your fields (like required, pattern, min, max, etc) and the component keeps track of your errors for you. You can also add custom error messages and a custom function for validation logic per field. The only standard form property this component doesn't accept is "onSubmit". That is because it has it's own onSubmit function, and after validating the data, it will either fire the onValidSubmissionAttempt or the onInvalidSubmissionAttempt.

Here is an example:

import{ValidatedReduxForm}from'@tkdaj/react-validated-form';import{TextField}from'@material-ui/core';<ValidatedReduxFormname="testForm"noValidatecustomValidators={{input1: {errorText: "Please enter a valid number."},theradios: {errorText: "You messed up. The correct answer is 3!",isValid: (e)=>e.taget.value==='3'},}}onValidSubmissionAttempt={(e,formValues)=>{console.log("valid submission",formValues);}}onInvalidSubmissionAttempt={(e,formValues)=>{console.log("invalid submission",formValues);}}><inputchecked={this.state.thecheckbox}onChange={e=>this.setState({thecheckbox: e.target.checked})}name="thecheckbox"type="checkbox"required/><labelhtmlFor="theradios"><inputchecked={this.state.theradios==='1'}onChange={e=>this.setState({theradios: e.target.value})}id="theradios"name="theradios"requiredtype="radio"value="1"/><inputchecked={this.state.theradios==='2'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="2"/><inputchecked={this.state.theradios==='3'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="3"/></label><TextFieldname="input1"value={this.state.input1}onChange={e=>this.setState({input1: e.target.value})}margin="dense"label="Input 1"type="text"requiredinputProps={{pattern: '\\d+'}}/><labelhtmlFor="theselect">Dropdown</label><selectvalue={this.state.theselect}onChange={e=>this.setState({theselect: e.target.value})}onBlur={e=>this.setState({theselect: e.target.value})}requiredname="theselect"id="theselect"><optionvalue="">Default</option><optionvalue="1">1</option><optionvalue="2">2</option><optionvalue="3">3</option></select><buttontype="submit">Submit</button><buttononClick={this.formRef?.current?.resetFormSubmitted}type="button">Resetformsubmittedvalue</button><ValidatedReduxForm/>

API

All regular attributes which can be applied to a form work here too except for onSubmit

name: required for the form as well as ALL validatable fields -- If you do not have a name on a field, you will get a warning logged to your console. Since sometimes it is difficult or impossible to add a name to a field (when using third party libraries), the next prop is available to mute those warnings.

onInvalidSubmissionAttempt: If a submission is attempted, but it is invalid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

onValidSubmissionAttempt: If a submission is attempted, and it is valid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

hideNameWarningsoptional as described in the name section of this API, names are required, so you will get a warning logged to the console if one of your fields is missing a name by default. You can turn this off by setting hideNameWarnings to true.

formErrorClass: optional Specific error class to be applied to the entire form

customValidators: optional An object which can contain custom error messages or validation logic within an isValid function. It should be shaped like this:

customValidators: {[fieldName: string]: {isValid?: (value: any)=>boolean;errorText?: string;};};

If you don't supply any custom error text, then the default HTML5 error text will be used.


onFormChanged: optional[ValidatedForm ONLY] It fires any time a form value is changed and the function is shaped as follows:

 onFormChanged?: (updatedField: HTMLFormElement,updatedFormState: IValidatedFormState)=>void;

Data Structure

A single form follows the shape shown in IValidatedFormState shown here:

exportinterfaceIValidatedFormState{submissionAttempted: boolean;formIsValid: boolean;formValues: FormValues;}exporttypeFormValues={[fieldName: string]: {value: any;error: string;};};

Using Without Redux

To use the standard ValidatedForm without redux, you use it in place of a normal <form> tag. Since the non-redux form does not have access to a global store to store the validated data in, there are 2 methods specifically added to ValidatedForm which are meant to be accessed from outside the form: getFormData and resetFormSubmitted In order to access these, create a ref object using React.createRef() or the useRef(null) hook. Then, add the created ref to your ValidatedForm like:

import{ValidatedForm}from'@tkdaj/react-validated-form';<ValidatedFormname="myForm"ref={this.myFormRef}/>;

Once you have done that you can access the function using the ref. For example: this.myFormRef.current.getFormData() or this.myFormRef.current.resetFormSubmitted()

Using With Redux

Since all of the form data is stored inside redux with this component, there is no need for an accessible getFormData function as shown in the "Using Without Redux" section above, but resetFormSubmitted is still publicly available. In order to access it use a ref as shown in the instructions above under "Using Without Redux". For simplicity, all forms are stored inside redux under the name: validatedForms. If you want to get data from a form it will be validatedForms.myFormName where myFormName is the name of one of your ValidatedReduxForms. The only boilerplate you need to do to set this up other than using the component is:

import{validatedForms}from'@tkdaj/react-validated-form';// important! You must use the name 'validatedForms' when adding it to your store otherwise the ValidatedReduxForm component won't be able to update the proper values

In the case of both redux and non-redux forms you should store the form field's values and set their onChange like normal. See src/Demo/ReduxFormDemo.tsx or src/Demo/StandardFormDemo.tsx for more information.

About

A simple form component which automatically validates all elements within itself. There are two versions - one to be used with just React, and another to be used to React and Redux

Topics

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ValidatedForms

NPM repo: https://www.npmjs.com/package/@tkdaj/react-validated-form

bugs can be reported to: tkdaj.packages@gmail.com

This project includes both a ValidatedReduxForm and a regular ValidatedForm. The purpose of both is to take the headache out of validating forms for you! All you need to do is use one of these components instead of a regular <form> tag, and use standard html validation on your fields (like required, pattern, min, max, etc) and the component keeps track of your errors for you. You can also add custom error messages and a custom function for validation logic per field. The only standard form property this component doesn't accept is "onSubmit". That is because it has it's own onSubmit function, and after validating the data, it will either fire the onValidSubmissionAttempt or the onInvalidSubmissionAttempt.

Here is an example:

import{ValidatedReduxForm}from'@tkdaj/react-validated-form';import{TextField}from'@material-ui/core';<ValidatedReduxFormname="testForm"noValidatecustomValidators={{input1: {errorText: "Please enter a valid number."},theradios: {errorText: "You messed up. The correct answer is 3!",isValid: (e)=>e.taget.value==='3'},}}onValidSubmissionAttempt={(e,formValues)=>{console.log("valid submission",formValues);}}onInvalidSubmissionAttempt={(e,formValues)=>{console.log("invalid submission",formValues);}}><inputchecked={this.state.thecheckbox}onChange={e=>this.setState({thecheckbox: e.target.checked})}name="thecheckbox"type="checkbox"required/><labelhtmlFor="theradios"><inputchecked={this.state.theradios==='1'}onChange={e=>this.setState({theradios: e.target.value})}id="theradios"name="theradios"requiredtype="radio"value="1"/><inputchecked={this.state.theradios==='2'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="2"/><inputchecked={this.state.theradios==='3'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="3"/></label><TextFieldname="input1"value={this.state.input1}onChange={e=>this.setState({input1: e.target.value})}margin="dense"label="Input 1"type="text"requiredinputProps={{pattern: '\\d+'}}/><labelhtmlFor="theselect">Dropdown</label><selectvalue={this.state.theselect}onChange={e=>this.setState({theselect: e.target.value})}onBlur={e=>this.setState({theselect: e.target.value})}requiredname="theselect"id="theselect"><optionvalue="">Default</option><optionvalue="1">1</option><optionvalue="2">2</option><optionvalue="3">3</option></select><buttontype="submit">Submit</button><buttononClick={this.formRef?.current?.resetFormSubmitted}type="button">Resetformsubmittedvalue</button><ValidatedReduxForm/>

API

All regular attributes which can be applied to a form work here too except for onSubmit

name: required for the form as well as ALL validatable fields -- If you do not have a name on a field, you will get a warning logged to your console. Since sometimes it is difficult or impossible to add a name to a field (when using third party libraries), the next prop is available to mute those warnings.

onInvalidSubmissionAttempt: If a submission is attempted, but it is invalid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

onValidSubmissionAttempt: If a submission is attempted, and it is valid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

hideNameWarningsoptional as described in the name section of this API, names are required, so you will get a warning logged to the console if one of your fields is missing a name by default. You can turn this off by setting hideNameWarnings to true.

formErrorClass: optional Specific error class to be applied to the entire form

customValidators: optional An object which can contain custom error messages or validation logic within an isValid function. It should be shaped like this:

customValidators: {[fieldName: string]: {isValid?: (value: any)=>boolean;errorText?: string;};};

If you don't supply any custom error text, then the default HTML5 error text will be used.


onFormChanged: optional[ValidatedForm ONLY] It fires any time a form value is changed and the function is shaped as follows:

 onFormChanged?: (updatedField: HTMLFormElement,updatedFormState: IValidatedFormState)=>void;

Data Structure

A single form follows the shape shown in IValidatedFormState shown here:

exportinterfaceIValidatedFormState{submissionAttempted: boolean;formIsValid: boolean;formValues: FormValues;}exporttypeFormValues={[fieldName: string]: {value: any;error: string;};};

Using Without Redux

To use the standard ValidatedForm without redux, you use it in place of a normal <form> tag. Since the non-redux form does not have access to a global store to store the validated data in, there are 2 methods specifically added to ValidatedForm which are meant to be accessed from outside the form: getFormData and resetFormSubmitted In order to access these, create a ref object using React.createRef() or the useRef(null) hook. Then, add the created ref to your ValidatedForm like:

import{ValidatedForm}from'@tkdaj/react-validated-form';<ValidatedFormname="myForm"ref={this.myFormRef}/>;

Once you have done that you can access the function using the ref. For example: this.myFormRef.current.getFormData() or this.myFormRef.current.resetFormSubmitted()

Using With Redux

Since all of the form data is stored inside redux with this component, there is no need for an accessible getFormData function as shown in the "Using Without Redux" section above, but resetFormSubmitted is still publicly available. In order to access it use a ref as shown in the instructions above under "Using Without Redux". For simplicity, all forms are stored inside redux under the name: validatedForms. If you want to get data from a form it will be validatedForms.myFormName where myFormName is the name of one of your ValidatedReduxForms. The only boilerplate you need to do to set this up other than using the component is:

import{validatedForms}from'@tkdaj/react-validated-form';// important! You must use the name 'validatedForms' when adding it to your store otherwise the ValidatedReduxForm component won't be able to update the proper values

In the case of both redux and non-redux forms you should store the form field's values and set their onChange like normal. See src/Demo/ReduxFormDemo.tsx or src/Demo/StandardFormDemo.tsx for more information.

About

A simple form component which automatically validates all elements within itself. There are two versions - one to be used with just React, and another to be used to React and Redux

Topics

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ValidatedForms

NPM repo: https://www.npmjs.com/package/@tkdaj/react-validated-form

bugs can be reported to: tkdaj.packages@gmail.com

This project includes both a ValidatedReduxForm and a regular ValidatedForm. The purpose of both is to take the headache out of validating forms for you! All you need to do is use one of these components instead of a regular <form> tag, and use standard html validation on your fields (like required, pattern, min, max, etc) and the component keeps track of your errors for you. You can also add custom error messages and a custom function for validation logic per field. The only standard form property this component doesn't accept is "onSubmit". That is because it has it's own onSubmit function, and after validating the data, it will either fire the onValidSubmissionAttempt or the onInvalidSubmissionAttempt.

Here is an example:

import{ValidatedReduxForm}from'@tkdaj/react-validated-form';import{TextField}from'@material-ui/core';<ValidatedReduxFormname="testForm"noValidatecustomValidators={{input1: {errorText: "Please enter a valid number."},theradios: {errorText: "You messed up. The correct answer is 3!",isValid: (e)=>e.taget.value==='3'},}}onValidSubmissionAttempt={(e,formValues)=>{console.log("valid submission",formValues);}}onInvalidSubmissionAttempt={(e,formValues)=>{console.log("invalid submission",formValues);}}><inputchecked={this.state.thecheckbox}onChange={e=>this.setState({thecheckbox: e.target.checked})}name="thecheckbox"type="checkbox"required/><labelhtmlFor="theradios"><inputchecked={this.state.theradios==='1'}onChange={e=>this.setState({theradios: e.target.value})}id="theradios"name="theradios"requiredtype="radio"value="1"/><inputchecked={this.state.theradios==='2'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="2"/><inputchecked={this.state.theradios==='3'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="3"/></label><TextFieldname="input1"value={this.state.input1}onChange={e=>this.setState({input1: e.target.value})}margin="dense"label="Input 1"type="text"requiredinputProps={{pattern: '\\d+'}}/><labelhtmlFor="theselect">Dropdown</label><selectvalue={this.state.theselect}onChange={e=>this.setState({theselect: e.target.value})}onBlur={e=>this.setState({theselect: e.target.value})}requiredname="theselect"id="theselect"><optionvalue="">Default</option><optionvalue="1">1</option><optionvalue="2">2</option><optionvalue="3">3</option></select><buttontype="submit">Submit</button><buttononClick={this.formRef?.current?.resetFormSubmitted}type="button">Resetformsubmittedvalue</button><ValidatedReduxForm/>

API

All regular attributes which can be applied to a form work here too except for onSubmit

name: required for the form as well as ALL validatable fields -- If you do not have a name on a field, you will get a warning logged to your console. Since sometimes it is difficult or impossible to add a name to a field (when using third party libraries), the next prop is available to mute those warnings.

onInvalidSubmissionAttempt: If a submission is attempted, but it is invalid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

onValidSubmissionAttempt: If a submission is attempted, and it is valid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

hideNameWarningsoptional as described in the name section of this API, names are required, so you will get a warning logged to the console if one of your fields is missing a name by default. You can turn this off by setting hideNameWarnings to true.

formErrorClass: optional Specific error class to be applied to the entire form

customValidators: optional An object which can contain custom error messages or validation logic within an isValid function. It should be shaped like this:

customValidators: {[fieldName: string]: {isValid?: (value: any)=>boolean;errorText?: string;};};

If you don't supply any custom error text, then the default HTML5 error text will be used.


onFormChanged: optional[ValidatedForm ONLY] It fires any time a form value is changed and the function is shaped as follows:

 onFormChanged?: (updatedField: HTMLFormElement,updatedFormState: IValidatedFormState)=>void;

Data Structure

A single form follows the shape shown in IValidatedFormState shown here:

exportinterfaceIValidatedFormState{submissionAttempted: boolean;formIsValid: boolean;formValues: FormValues;}exporttypeFormValues={[fieldName: string]: {value: any;error: string;};};

Using Without Redux

To use the standard ValidatedForm without redux, you use it in place of a normal <form> tag. Since the non-redux form does not have access to a global store to store the validated data in, there are 2 methods specifically added to ValidatedForm which are meant to be accessed from outside the form: getFormData and resetFormSubmitted In order to access these, create a ref object using React.createRef() or the useRef(null) hook. Then, add the created ref to your ValidatedForm like:

import{ValidatedForm}from'@tkdaj/react-validated-form';<ValidatedFormname="myForm"ref={this.myFormRef}/>;

Once you have done that you can access the function using the ref. For example: this.myFormRef.current.getFormData() or this.myFormRef.current.resetFormSubmitted()

Using With Redux

Since all of the form data is stored inside redux with this component, there is no need for an accessible getFormData function as shown in the "Using Without Redux" section above, but resetFormSubmitted is still publicly available. In order to access it use a ref as shown in the instructions above under "Using Without Redux". For simplicity, all forms are stored inside redux under the name: validatedForms. If you want to get data from a form it will be validatedForms.myFormName where myFormName is the name of one of your ValidatedReduxForms. The only boilerplate you need to do to set this up other than using the component is:

import{validatedForms}from'@tkdaj/react-validated-form';// important! You must use the name 'validatedForms' when adding it to your store otherwise the ValidatedReduxForm component won't be able to update the proper values

In the case of both redux and non-redux forms you should store the form field's values and set their onChange like normal. See src/Demo/ReduxFormDemo.tsx or src/Demo/StandardFormDemo.tsx for more information.

About

A simple form component which automatically validates all elements within itself. There are two versions - one to be used with just React, and another to be used to React and Redux

Topics

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ValidatedForms

NPM repo: https://www.npmjs.com/package/@tkdaj/react-validated-form

bugs can be reported to: tkdaj.packages@gmail.com

This project includes both a ValidatedReduxForm and a regular ValidatedForm. The purpose of both is to take the headache out of validating forms for you! All you need to do is use one of these components instead of a regular <form> tag, and use standard html validation on your fields (like required, pattern, min, max, etc) and the component keeps track of your errors for you. You can also add custom error messages and a custom function for validation logic per field. The only standard form property this component doesn't accept is "onSubmit". That is because it has it's own onSubmit function, and after validating the data, it will either fire the onValidSubmissionAttempt or the onInvalidSubmissionAttempt.

Here is an example:

import{ValidatedReduxForm}from'@tkdaj/react-validated-form';import{TextField}from'@material-ui/core';<ValidatedReduxFormname="testForm"noValidatecustomValidators={{input1: {errorText: "Please enter a valid number."},theradios: {errorText: "You messed up. The correct answer is 3!",isValid: (e)=>e.taget.value==='3'},}}onValidSubmissionAttempt={(e,formValues)=>{console.log("valid submission",formValues);}}onInvalidSubmissionAttempt={(e,formValues)=>{console.log("invalid submission",formValues);}}><inputchecked={this.state.thecheckbox}onChange={e=>this.setState({thecheckbox: e.target.checked})}name="thecheckbox"type="checkbox"required/><labelhtmlFor="theradios"><inputchecked={this.state.theradios==='1'}onChange={e=>this.setState({theradios: e.target.value})}id="theradios"name="theradios"requiredtype="radio"value="1"/><inputchecked={this.state.theradios==='2'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="2"/><inputchecked={this.state.theradios==='3'}onChange={e=>this.setState({theradios: e.target.value})}name="theradios"type="radio"value="3"/></label><TextFieldname="input1"value={this.state.input1}onChange={e=>this.setState({input1: e.target.value})}margin="dense"label="Input 1"type="text"requiredinputProps={{pattern: '\\d+'}}/><labelhtmlFor="theselect">Dropdown</label><selectvalue={this.state.theselect}onChange={e=>this.setState({theselect: e.target.value})}onBlur={e=>this.setState({theselect: e.target.value})}requiredname="theselect"id="theselect"><optionvalue="">Default</option><optionvalue="1">1</option><optionvalue="2">2</option><optionvalue="3">3</option></select><buttontype="submit">Submit</button><buttononClick={this.formRef?.current?.resetFormSubmitted}type="button">Resetformsubmittedvalue</button><ValidatedReduxForm/>

API

All regular attributes which can be applied to a form work here too except for onSubmit

name: required for the form as well as ALL validatable fields -- If you do not have a name on a field, you will get a warning logged to your console. Since sometimes it is difficult or impossible to add a name to a field (when using third party libraries), the next prop is available to mute those warnings.

onInvalidSubmissionAttempt: If a submission is attempted, but it is invalid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

onValidSubmissionAttempt: If a submission is attempted, and it is valid, this funcion will be called. Two parameters are passed - the submit event object and the object containing the validated form's values and errors.

hideNameWarningsoptional as described in the name section of this API, names are required, so you will get a warning logged to the console if one of your fields is missing a name by default. You can turn this off by setting hideNameWarnings to true.

formErrorClass: optional Specific error class to be applied to the entire form

customValidators: optional An object which can contain custom error messages or validation logic within an isValid function. It should be shaped like this:

customValidators: {[fieldName: string]: {isValid?: (value: any)=>boolean;errorText?: string;};};

If you don't supply any custom error text, then the default HTML5 error text will be used.


onFormChanged: optional[ValidatedForm ONLY] It fires any time a form value is changed and the function is shaped as follows:

 onFormChanged?: (updatedField: HTMLFormElement,updatedFormState: IValidatedFormState)=>void;

Data Structure

A single form follows the shape shown in IValidatedFormState shown here:

exportinterfaceIValidatedFormState{submissionAttempted: boolean;formIsValid: boolean;formValues: FormValues;}exporttypeFormValues={[fieldName: string]: {value: any;error: string;};};

Using Without Redux

To use the standard ValidatedForm without redux, you use it in place of a normal <form> tag. Since the non-redux form does not have access to a global store to store the validated data in, there are 2 methods specifically added to ValidatedForm which are meant to be accessed from outside the form: getFormData and resetFormSubmitted In order to access these, create a ref object using React.createRef() or the useRef(null) hook. Then, add the created ref to your ValidatedForm like:

import{ValidatedForm}from'@tkdaj/react-validated-form';<ValidatedFormname="myForm"ref={this.myFormRef}/>;

Once you have done that you can access the function using the ref. For example: this.myFormRef.current.getFormData() or this.myFormRef.current.resetFormSubmitted()

Using With Redux

Since all of the form data is stored inside redux with this component, there is no need for an accessible getFormData function as shown in the "Using Without Redux" section above, but resetFormSubmitted is still publicly available. In order to access it use a ref as shown in the instructions above under "Using Without Redux". For simplicity, all forms are stored inside redux under the name: validatedForms. If you want to get data from a form it will be validatedForms.myFormName where myFormName is the name of one of your ValidatedReduxForms. The only boilerplate you need to do to set this up other than using the component is:

import{validatedForms}from'@tkdaj/react-validated-form';// important! You must use the name 'validatedForms' when adding it to your store otherwise the ValidatedReduxForm component won't be able to update the proper values

In the case of both redux and non-redux forms you should store the form field's values and set their onChange like normal. See src/Demo/ReduxFormDemo.tsx or src/Demo/StandardFormDemo.tsx for more information.

About

A simple form component which automatically validates all elements within itself. There are two versions - one to be used with just React, and another to be used to React and Redux

Topics

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages