wekan/packages/meteor-useraccounts-core/lib/field.js

293 lines
6.3 KiB
JavaScript
Raw Normal View History

// ---------------------------------------------------------------------------------
// Field object
// ---------------------------------------------------------------------------------
Field = function(field) {
check(field, FIELD_PAT);
_.defaults(this, field);
this.validating = new ReactiveVar(false);
this.status = new ReactiveVar(null);
};
if (Meteor.isClient) {
Field.prototype.clearStatus = function() {
return this.status.set(null);
};
}
if (Meteor.isServer) {
Field.prototype.clearStatus = function() {
// Nothing to do server-side
return;
};
}
Field.prototype.fixValue = function(value) {
if (this.type === "checkbox") {
return !!value;
}
if (this.type === "select") {
// TODO: something working...
return value;
}
if (this.type === "radio") {
// TODO: something working...
return value;
}
// Possibly applies required transformations to the input value
if (this.trim) {
value = value.trim();
}
if (this.lowercase) {
value = value.toLowerCase();
}
if (this.uppercase) {
value = value.toUpperCase();
}
if (!!this.transform) {
value = this.transform(value);
}
return value;
};
if (Meteor.isClient) {
Field.prototype.getDisplayName = function(state) {
var displayName = this.displayName;
if (_.isFunction(displayName)) {
displayName = displayName();
} else if (_.isObject(displayName)) {
displayName = displayName[state] || displayName["default"];
}
if (!displayName) {
displayName = capitalize(this._id);
}
return displayName;
};
}
if (Meteor.isClient) {
Field.prototype.getPlaceholder = function(state) {
var placeholder = this.placeholder;
if (_.isObject(placeholder)) {
placeholder = placeholder[state] || placeholder["default"];
}
if (!placeholder) {
placeholder = capitalize(this._id);
}
return placeholder;
};
}
Field.prototype.getStatus = function() {
return this.status.get();
};
if (Meteor.isClient) {
Field.prototype.getValue = function(templateInstance) {
if (this.type === "checkbox") {
return !!(templateInstance.$("#at-field-" + this._id + ":checked").val());
}
if (this.type === "radio") {
return templateInstance.$("[name=at-field-"+ this._id + "]:checked").val();
}
return templateInstance.$("#at-field-" + this._id).val();
};
}
if (Meteor.isClient) {
Field.prototype.hasError = function() {
return this.negativeValidation && this.status.get();
};
}
if (Meteor.isClient) {
Field.prototype.hasIcon = function() {
if (this.showValidating && this.isValidating()) {
return true;
}
if (this.negativeFeedback && this.hasError()) {
return true;
}
if (this.positiveFeedback && this.hasSuccess()) {
return true;
}
};
}
if (Meteor.isClient) {
Field.prototype.hasSuccess = function() {
return this.positiveValidation && this.status.get() === false;
};
}
if (Meteor.isClient)
Field.prototype.iconClass = function() {
if (this.isValidating()) {
return AccountsTemplates.texts.inputIcons["isValidating"];
}
if (this.hasError()) {
return AccountsTemplates.texts.inputIcons["hasError"];
}
if (this.hasSuccess()) {
return AccountsTemplates.texts.inputIcons["hasSuccess"];
}
};
if (Meteor.isClient) {
Field.prototype.isValidating = function() {
return this.validating.get();
};
}
if (Meteor.isClient) {
Field.prototype.setError = function(err) {
check(err, Match.OneOf(String, undefined, Boolean));
if (err === false) {
return this.status.set(false);
}
return this.status.set(err || true);
};
}
if (Meteor.isServer) {
Field.prototype.setError = function(err) {
// Nothing to do server-side
return;
};
}
if (Meteor.isClient) {
Field.prototype.setSuccess = function() {
return this.status.set(false);
};
}
if (Meteor.isServer) {
Field.prototype.setSuccess = function() {
// Nothing to do server-side
return;
};
}
if (Meteor.isClient) {
Field.prototype.setValidating = function(state) {
check(state, Boolean);
return this.validating.set(state);
};
}
if (Meteor.isServer) {
Field.prototype.setValidating = function(state) {
// Nothing to do server-side
return;
};
}
if (Meteor.isClient) {
Field.prototype.setValue = function(templateInstance, value) {
if (this.type === "checkbox") {
templateInstance.$("#at-field-" + this._id).prop('checked', true);
return;
}
if (this.type === "radio") {
templateInstance.$("[name=at-field-"+ this._id + "]").prop('checked', true);
return;
}
templateInstance.$("#at-field-" + this._id).val(value);
};
}
Field.prototype.validate = function(value, strict) {
check(value, Match.OneOf(undefined, String, Boolean));
this.setValidating(true);
this.clearStatus();
if (_.isUndefined(value) || value === '') {
if (!!strict) {
if (this.required) {
this.setError(AccountsTemplates.texts.requiredField);
this.setValidating(false);
return AccountsTemplates.texts.requiredField;
} else {
this.setSuccess();
this.setValidating(false);
return false;
}
} else {
this.clearStatus();
this.setValidating(false);
return null;
}
}
var valueLength = value.length;
var minLength = this.minLength;
if (minLength && valueLength < minLength) {
this.setError(AccountsTemplates.texts.minRequiredLength + ": " + minLength);
this.setValidating(false);
return AccountsTemplates.texts.minRequiredLength + ": " + minLength;
}
var maxLength = this.maxLength;
if (maxLength && valueLength > maxLength) {
this.setError(AccountsTemplates.texts.maxAllowedLength + ": " + maxLength);
this.setValidating(false);
return AccountsTemplates.texts.maxAllowedLength + ": " + maxLength;
}
if (this.re && valueLength && !value.match(this.re)) {
this.setError(this.errStr);
this.setValidating(false);
return this.errStr;
}
if (this.func) {
var result = this.func(value);
var err = result === true ? this.errStr || true : result;
if (_.isUndefined(result)) {
return err;
}
this.status.set(err);
this.setValidating(false);
return err;
}
this.setSuccess();
this.setValidating(false);
return false;
};