JSFiddle - React, Tailwind, and code Playground

by jiggle

HTML

<script src="https://rawgithub.com/ericmbarnard/Knockout-Validation/master/Src/knockout.validation.js"></script>
<script id="customMessageTemplate" type="text/html">
    <em class="customMessage" data-bind='validationMessage: field'></em>
</script>
<fieldset>
    <legend>User: <span data-bind='text: errors().length'></span> errors</legend>
    <label>Feedback 1: <input data-bind='value: feedback1' required/></label>
    <label>Feedback 2: <input data-bind='value: feedback2' required/></label>    
    
    <label>
        Subscriptions: 
        <select data-bind='value: feedback3, options: feedback3Options, optionsCaption: "Choose one..."' required></select>
    </label>
   <label>Feedback 4: <input data-bind='value: feedback4' required/></label>   
    <label>Feedback 5: <input data-bind='value: feedback5' required/></label>   
    <label>Feedback 6: <input data-bind='value: feedback6' required/></label>   
        <label>Feedback 7: <input data-bind='value: feedback7' required/></label>   
</fieldset>
<button type="button" data-bind='click: submit'>Submit</button>
        
        <button type="button" data-bind='click: submit, enable:isComplete'>Submit (disabled if not complete)</button>
        
        <button type="button" data-bind='click: submit, enable:errors().length===0'>Submit (disabled if not complete)</button>
        
<br />
<br />

       Display inline error messages? <input type="checkbox" data-bind='click: toggleInlineErrors,checked:showInlineErrors'/>

CSS

label { display: block; }
.validationMessage { color: Red; }
.customMessage { color: Orange; }

JavaScript

ko.validation.rules.pattern.message = 'Invalid.';
    

ko.validation.configure({
    registerExtenders: true,
    messagesOnModified: true,
    insertMessages: true,
    parseInputAttributes: true,
    messageTemplate: null
});


var captcha = function (val) {
    return val == 11;
};

var mustEqual = function (val, other) {
    return val == other();
};

var viewModel = {
    feedback1: ko.observable(),  //required attribute is set in the HTML
    feedback2: ko.observable(),  //required attribute is set in the HTML
    feedback3: ko.observable(),  //required attribute is set in the HTML
    feedback4: ko.observable(),  //required attribute is set in the HTML
    feedback5: ko.observable(),  //required attribute is set in the HTML
    feedback6: ko.observable(),  //required attribute is set in the HTML
    feedback7: ko.observable().extend({ required: true }), //or add the required attribute when you create the observable
    feedback3Options: ['Technology', 'Music'],
   
    submit: function () {
        if (viewModel.errors().length == 0) {
            alert('Thank you.');
        } else {
            
            viewModel.errors.showAllMessages(this.showInlineErrors());
            alert('Please check your submission.');
        }
    }
};



viewModel.showInlineErrors = ko.observable(true);

viewModel.errors = ko.validation.group(viewModel);

viewModel.isComplete = ko.computed(function(){
    return viewModel.errors().length === 0
});

viewModel.toggleInlineErrors = function () {
    
    viewModel.errors.showAllMessages(false);
    return true;
};

addEventListener('load', function () {
ko.applyBindings(viewModel);
});