Skip to content

Instantly share code, notes, and snippets.

@mryellow
Created April 29, 2015 18:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mryellow/cc2a9a677775877b5fd4 to your computer and use it in GitHub Desktop.
Save mryellow/cc2a9a677775877b5fd4 to your computer and use it in GitHub Desktop.
define(['durandal/app', 'plugins/observable', 'knockout', 'ko-validation'], function (app, observable, ko) {
/*jshint -W069 */
ko.validation.rules['password'] = {
validator: function (val, flag) {
//console.log('val', ModelUserSettings.auth);
//if (ModelUserSettings && ModelUserSettings.auth) return true;
if (ko.validation.utils.isEmptyVal(val)) return false;
var patt = /^[-+\sa-zA-Z0-9]*$/;
return (flag && typeof val === 'string' && patt.test(val));
},
message: 'Please enter a valid password'
};
ko.validation.rules['alphaNumSpace'] = {
validator: function (val, flag) {
if (ko.validation.utils.isEmptyVal(val)) return true;
var patt = /^[-+\sa-zA-Z0-9]*$/;
return (flag && typeof val === 'string' && patt.test(val));
},
message: 'Please enter alphanumeric characters only'
};
// FIXME: validate lower-case and convert to upper in computed?
ko.validation.rules['currencyCode'] = {
validator: function (val, flag) {
if (ko.validation.utils.isEmptyVal(val)) return true;
var patt = /^[A-Z]{3}$/;
return (flag && typeof val === 'string' && patt.test(val));
},
message: 'Currency must be 3 letter code'
};
/*jshint +W069 */
// TODO: same in both these bindings, target changes, could be encapsulated.
// Get underlying observable and pass value to `validationElement`.
ko.bindingHandlers.validationElementForProperty = {
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var propertyName = ko.utils.unwrapObservable(valueAccessor());
var propertyObservable = observable(bindingContext.$data, propertyName);
// If not found in current context find in parent context.
if (!ko.isObservable(propertyObservable)) {
propertyObservable = observable(bindingContext.$parent, propertyName);
}
// Call knockout 'validationElement' binding.
ko.bindingHandlers.validationElement.update(element, function () {
return propertyObservable;
}, allBindings, viewModel, bindingContext);
}
};
// Get underlying observable and pass value to `validationMessage`.
ko.bindingHandlers.validationMessageForProperty = {
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var propertyName = ko.utils.unwrapObservable(valueAccessor());
var propertyObservable = observable(bindingContext.$data, propertyName);
// If not found in current context find in parent context.
if (!ko.isObservable(propertyObservable)) {
propertyObservable = observable(bindingContext.$parent, propertyName);
}
// Call knockout 'validationMessage' binding.
ko.bindingHandlers.validationMessage.update(element, function () {
return propertyObservable;
}, allBindings, viewModel, bindingContext);
}
};
ko.validation.init({
registerExtenders: true,
messagesOnModified: true,
//insertMessages: true,
parseInputAttributes: true,
//messageTemplate: null,
insertMessages: false,
decorateElement: true,
decorateInputElement: true,
errorElementClass: 'has-error',
errorMessageClass: 'help-block'
}, true);
});
@mryellow
Copy link
Author

Yes, the password regexp sucks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment