UNPKG

univalid-strategy-form

Version:

Form strategy implementation for univalid module (extends 'univalid-strategy')

614 lines (411 loc) 11.5 kB
# univalid-strategy-form Html Form Strategy for [univalid](https://github.com/StetsD/univalid) module. Extends [univalid-strategy](https://github.com/StetsD/univalid-strategy) class ## Install ##### You need also install [univalid](https://github.com/StetsD/univalid) module, it is a core of validation, which manage different strategies. ```sh npm i univalid npm i univalid-strategy-form ``` ## Base usage ### .js ```js const univalid = require('univalid')(); const UnivalidStrategyForm = require('univalid-strategy-form'); // Base initialize (set strategy) univalid.setStrategy( UnivalidStrategyForm({ core: univalid, /* required prop */ $form: '.js-reg-form', /* required prop */ statusConfig: { targetParent: '.form-group', targetStatus: '.form__msg' } }) ); univalid.on('end:valid', uni => { console.log(uni.getCommonState, uni.getState); uni.clearState(); }); ``` ### .html ```html <form action="/" method="POST" class="js-reg-form"> <div class="form-group"> <label>Username</label> <input name="username" data-validation="required" data-f="oL" data-msg='{"empty":"This Filed empty", "invalid": "This Field Invalid", "filter": "Latin Only", "success": "Is Ok"}'> <div class="form__msg"></div> </div> <div class="form-group"> <label>Lastname</label> <input name="lastname" data-validation data-f="oC"> <div class="form__msg"></div> </div> <div class="form-group"> <label>Email address</label> <input name="email" data-validation="email"> <div class="form__msg"></div> </div> </form> ``` ## Setting data-validation in .html Add to your html form elements (inputs, selects, textarea) 'data-validation=[type]' In current time supports next types: - **required** - **email** - **password** - **equal** - (equal password type) ```html <div class="form-group"> <label>Username</label> <input type="text" name="username" class="form-control" data-validation="required"> <div class="form__msg"></div> </div> ``` ## Setting your custom data-validation in .html / js Do not forget that you have opportunity to set your custom validation handler. Like this: #### In .html ```html <div class="form-group"> <label>Username</label> <input type="text" name="username" class="form-control" data-validation="my:valid"> <div class="form__msg"></div> </div> ``` #### In .js ```js //input the 'example' univalid.setValidHandler({ 'my:valid': val => { if(val.match(/^example$/)){ return true; }else{ return false; } } }); ``` [Also see](https://github.com/StetsD/univalid#setvalidhandlerpack) ## Setting data-msg in .html You are also can define message (empty, invalid, filter, success) for individual input Add to your html form elements (inputs, selects, textarea) 'data-msg=[type]' type: - **empty** - **invalid** - ValidationHandler error - **filter** - Filter error ([univalid-key-logger](https://github.com/StetsD/univalid-key-logger) module) - **success** ##### ! data-msg must be a valid JSON type ```html <div class="form-group"> <label>Username</label> <input type="text" name="username" class="form-control" data-validation="required" data-msg='{"empty":"This Filed empty", "invalid": "This Field Invalid", "filter": "Latin Only", "success": "Is Ok"}'> <div class="form__msg"></div> </div> ``` - [Also see](https://github.com/StetsD/univalid#setmsgconfigconfig) how to set and edit default 'msgConfig' - [Also see](https://github.com/StetsD/univalid#setdefaultmsgconfigconfig) how to set common global 'msgConfig' for collections of forms - [Also see](https://github.com/StetsD/univalid#toggledefaultmsgconfig) how to toggle form on common global 'msgConfig' ## Setting data-f in .html You can define filer`s handler for individual input It Handled 'keyboard' events Add to your html form elements (inputs, selects, textarea) 'data-f=[type]' In current moment available patterns supporting types: - **oL** - only latin symbols - **oC** - only cyrillic symbols - **oN** - only numbers - **oP** - only numbers and latin symbols ```html <div class="form-group"> <label>Username</label> <input type="text" name="username" class="form-control" data-f="oL" data-validation="required"> <div class="form__msg"></div> </div> ``` ## API ### check(pack, core) Validating the pack **pack** - Type `object` Structure of pack must be strict. Like that: name, val, type - required fields ```js //name, val, type - required fields [ { name: 'username', val: 'Uriy', type: 'required', filter: 'oL', msg: { empty: 'You shall not pass', invalid: 'Validation error', filter: 'Filter error', success: 'All right' } }, { name: 'email', val: 'Uriy@mzf.com', type: 'email', filter: val => { // Your custom filter console.log('Filter', val); // if FilterHandler is Ok then "return true" return true; // else "return false" }, msg: { empty: 'You shall not pass', invalid: 'Bad email', filter: 'Only lat/numbers/specials symbols', success: 'All right' } }, ] ``` **core** - Type `object` The instance of 'univalid' module ### send(options) Send form method **options** - Type `object` - Default `sendConfig` option **options.newAjaxBody** - Type `object` New Ajax body config include: - newAjaxBody.type - Type `string` - (if set 'method', that bind html attribute method) - newAjaxBody.url - Type `string` - (if set 'action', that bind html attribute action) - newAjaxBody.data - data of form - newAjaxBody.notDisableSubmit - Type `boolean` **options.cbSendSuccess** - Type `function` **options.cbSendError** - Type `function` ```js univalid.get('send', {/* options */}); ``` **core** - Type `object` The instance of 'univalid' module ### setStatuses(pack) Method of set custom statuses **pack** - Type `array` Each field of item of array must be strict named. Item of pack must have three required field "name", "state", "msg". ```js univalid.get('setStatuses', [ { "name": "username", "state": "error", "msg": "this username is used" }, { "name": "email", "state": "error", "msg": "this email is used" } ]); ``` Example below shows how may to set statuses on inputs of form after get server validation result ```js univalid.setStrategy(UnivalidStrategyForm({ // ... sendConfig: { type: 'post', url: 'registration', cbSendError: (err, form) => { form.setStatuses(err.response); } }, // ... })); ``` ### clearStatuses(pack) Clear statuses of form and fields **pack** - Type `nodeList` Pack of html nodes inputs, selects, textareas ```js univalid.get('clearStatuses', [/* [ nodes ] */]); // or clear all statuses of form univalid.get('clearStatuses'); ``` ### clearInputs(inputs) Clear input values **inputs** - Type `node or nodeList` May be one node or array of nodes ```js univalid.get('clearInputs', [/* [ inputs ] */]); ``` ### addEvent(events) Add new event in form **events** - Type `object` May be one event or object of events ```js univalid.get('addEvent', { ClickInDocument(){ document.addEventListener('click', ()=>{ console.log('Click!') })} }); ``` ### disable() Disable all inputs, selects, textareas ```js univalid.get('disable'); ``` ### enable() Enable all inputs, selects, textareas ```js univalid.get('enable'); ``` ### getValidationHandlers() Get validation handlers. By default defined in [univalid-strategy](https://github.com/StetsD/univalid-strategy) abstract class ### set(option, val) Set the option in instance **option** - Type `string` ```js univalid.set('passConfig', {min: 10, analysis: ['hasLowercase', 'hasDigits', 'hasSpecials']}); ``` ### get(prop) Get the prop **prop** - Type `string` ```js univalid.get('passConfig'); ``` ## OPTIONS ### core Type `object` **! Required Prop** This is instance 'univalid' module Must be define on init ### $form Type `string` **! Required Prop** Form selector ### clsConfig Type `object` Default `{error: 'error', success: 'success'}` ClassName config ### passConfig Type `object` Default `{min: 6, analysis: ['hasUppercase', 'hasLowercase', 'hasDigits', 'hasSpecials']` Password config ```js univalid.set('passConfig', { min: 10, analysis: ['hasUppercase'] }); ``` ### statusConfig Type `object` Statuses config ```js univalid.set('statusConfig', { targetParent: '.form-group', targetStatus: '.form__msg', successStatus: true /* if show success status */ }); ``` ### sendConfig Type `object` SendForm config ```js univalid.set('sendConfig', { type: 'method', url: '/form', notDisableSubmit: true, cbSendSuccess: (res, univalidStrategyFormInstance) => { console.log(res, univalidStrategyFormInstance) }, cbSendError: (err, univalidStrategyFormInstance) => { console.log(err.response, univalidStrategyFormInstance); } }); ``` ### keyLogger Type `boolean` On\off keyLogger filters ```js univalid.set('keyLogger', true); ``` ### checkPassScore Type `object` CheckPasswordScore config ```js univalid.set('checkPassScore', { target: 'input[type="password"]', cb: val => { console.log(val); } }); ``` ## UNIVALID API Do not forget that you are also may use all methods from API univalid module. **Several examples** ```js // getCommonState - return common state ('success' or 'error') univalid.get('check'); if(univalid.getCommonState === 'success'){ univalid.get('send'); } // getState - return last state of validation univalid.get('check'); console.log(univalid.getState); // clearState - clear last state of validation univalid.get('check'); console.log(univalid.getState); univalid.clearState(); // getStrategy - return current strategy console.log(univalid.getStrategy); // getValidHandler - return current validation handlers console.log(univalid.getValidHandler); ``` ## EVENTS You can subscribe on univalid or univalid-strategy-form events. ```js univalid.on('start:valid', (args) => { console.log('Check!'); }); ``` **Table of events** | Event | Description | |:------:|:-----------:| |start:valid|Start validation pack| |end:valid|End validation pack| |start:valid:field|Start validation field| |end:valid:field|End validation field| |change:strategy|Change strategy event| |set:new-ValidationHandler|Set new ValidationHandler event| |change:msg-config|Change message config event| |clear:state|Clear state of last validation event| |e:submit|Submit form| |e:blur|Blur event on current input| |e:focus|Focus event on current input| |e:keyup|Keyup event on current input| |error|Error event| |clear:statuses|Clear statuses event| |send:form|Send form event| |clear:inputs|Clear inputs| ## License ISC ©