lion/packages/validate
2020-05-29 17:01:15 +02:00
..
docs feat: use markdown javascript (mdjs) for documentation 2020-05-29 17:01:15 +02:00
src feat(validate): introduce Pattern validator for Strings (#719) 2020-05-27 10:27:53 +02:00
test feat(validate): introduce Pattern validator for Strings (#719) 2020-05-27 10:27:53 +02:00
test-helpers feat(validate): use static validatorName instead of instance name (#600) 2020-02-26 15:25:12 +01:00
test-suites chore: apply prettier formatting changes 2020-04-29 10:05:06 +02:00
translations feat(validate): introduce Pattern validator for Strings (#719) 2020-05-27 10:27:53 +02:00
CHANGELOG.md chore: release new versions 2020-05-27 08:30:48 +00:00
index.js feat(validate): introduce Pattern validator for Strings (#719) 2020-05-27 10:27:53 +02:00
lion-validation-feedback.js feat(validate): new validation api, async validation and more 2019-11-15 16:57:58 +01:00
package.json chore: release new versions 2020-05-27 08:30:48 +00:00
README.md chore: updated dep versions and made compatible 2020-05-29 17:01:15 +02:00
test-helpers.js feat: finalize validation and adopt it everywhere 2019-11-18 15:30:08 +01:00

Validate

import { html } from '@lion/core';
import { LionInput } from '@lion/input';
import {
  Required,
  IsString,
  MaxLength,
  DefaultSuccess,
  Validator,
  loadDefaultFeedbackMessages,
} from '@lion/validate';

export default {
  title: 'Forms/Validation/Overview',
};

loadDefaultFeedbackMessages();

Features

  • allow for advanced UX scenarios by updating validation state on every value change
  • provide a powerful way of writing validation via pure functions
  • multiple validation types(error, warning, info, success)
  • default validators
  • custom validators

Our validation system is designed to:

  • allow for advanced UX scenarios by updating validation state on every value change
  • provide a powerful way of writing validations via classes

Validation is applied by default to all form controls via the ValidateMixin.

For a detailed description of the validation system and the ValidateMixin, please see ValidationSystem.

How to use

Installation

npm i --save @lion/validate
import '@lion/input/lion-input.js';
import { %ValidatorName% } from '@lion/validate';

Example

Note that we import an lion-input here as an example of a form control implementing ValidateMixin. We could equally well use lion-textarea, lion-select, lion-fieldset etc. to illustrate our example.

const isInitialsRegex = /^([A-Z]\.)+$/;
class IsInitialsExample extends Validator {
  static get validatorName() {
    return 'IsExampleInitials';
  }

  execute(value) {
    let hasFeedback = false;
    const isStringValidator = new IsString();
    if (isStringValidator.execute(value) || !isInitialsRegex.test(value)) {
      hasFeedback = true;
    }
    return hasFeedback;
  }

  static getMessage({ fieldName }) {
    return `Please enter a valid ${fieldName} in the format "L.I.".`;
  }
}

class DemoInput extends LionInput {
  static get validationTypes() {
    return ['error', 'warning', 'success'];
  }
}
customElements.define('demo-input', DemoInput);

export const main = () => html`
  <demo-input
    label="Initials"
    name="initials"
    .validators="${[
      new Required(),
      new MaxLength(10),
      new IsInitialsExample(null, { type: 'warning' }),
      new DefaultSuccess(),
    ]}"
  ></demo-input>
`;

In the example above we use different types of validators. A validator applied to .validators expects an array with a function, a parameters object and optionally an additional configuration object.

MinMaxLength({ min: 5, max: 10 });

The custom IsInitialsExample checks if the value is fitting our regex, but does not prevent the user from submitting other values.

Retrieving validity states is as easy as checking for:

myInitialsInput.hasFeedbackFor.include('error');