Files
ERP/sophal/js/form/form.input.text.js

207 lines
4.9 KiB
JavaScript

/*
* Axelor Business Solutions
*
* Copyright (C) 2005-2019 Axelor (<http://axelor.com>).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
(function() {
"use strict";
var ui = angular.module('axelor.ui');
/**
* The String widget.
*/
ui.formInput('String', {
css: 'string-item',
init: function(scope) {
var field = scope.field;
var isReadonly = scope.isReadonly;
var trKey = "$t:" + field.name;
scope.isReadonly = function () {
scope.$$readonlyOrig = isReadonly.apply(this, arguments);
return (scope.record && scope.record[trKey]) || scope.$$readonlyOrig;
};
scope.format = function (value) {
if ((scope.record && scope.record[trKey])) {
return scope.record[trKey];
}
return value;
};
},
link_editable: function(scope, element, attrs, model) {
this._super.apply(this, arguments);
var field = scope.field,
regex = field.pattern ? new RegExp(field.pattern, 'i') : null,
minSize = +(field.minSize),
maxSize = +(field.maxSize);
scope.validate = function(value) {
if (_.isEmpty(value)) {
return true;
}
var length = value.length,
valid = true;
if (minSize) {
valid = length >= minSize;
}
if(valid && maxSize) {
valid = length <= maxSize;
}
if (valid && regex) {
valid = regex.test(value);
}
return valid;
};
},
template_readonly: '<input type="text" ng-show="text" tabindex="-1" readonly="readonly" class="display-text" value="{{text}}">'
});
/**
* The Email input widget.
*/
ui.formInput('Email', {
css: 'email-item',
metaWidget: true,
pattern: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
link: function(scope, element, attrs, model) {
var pattern = this.pattern;
scope.validate = function(value) {
if(_.isEmpty(value)) {
return true;
}
return pattern.test(value);
};
},
template_editable: '<input type="email">',
template_readonly: '<a target="_blank" ng-show="text" href="mailto:{{text}}">{{text}}</a>'
});
/**
* The URL input widget.
*/
ui.formInput('Url', {
css: 'url-item',
metaWidget: true,
template_editable: '<input type="url">',
template_readonly: '<a target="_blank" ng-show="text" href="{{text}}">{{text}}</a>'
});
/**
* The Phone input widget.
*/
ui.formInput('Phone', 'String', {
css: 'phone-item',
template_editable: '<input type="tel">'
});
/**
* The Text input widget.
*/
ui.formInput('Text', {
css: 'text-item',
link_editable: function(scope, element, attrs, model) {
this._super.apply(this, arguments);
var field = scope.field,
textarea = element.get(0);
textarea.rows = parseInt(field.height) || 8;
//Firefox add one more line
if (axelor.browser.mozilla) {
textarea.rows -= 1;
}
var field = scope.field,
regex = field.pattern ? new RegExp(field.pattern, 'i') : null,
minSize = +(field.minSize),
maxSize = +(field.maxSize);
scope.validate = function(value) {
if (_.isEmpty(value)) {
return true;
}
var length = value.length,
valid = true;
if (minSize) {
valid = length >= minSize;
}
if(valid && maxSize) {
valid = length <= maxSize;
}
if (valid && regex) {
valid = regex.test(value);
}
return valid;
};
},
template_editable: '<textarea></textarea >',
template_readonly: '<pre ng-show="text">{{text}}</pre>'
});
ui.formInput('Password', 'String', {
css: 'password-item',
metaWidget: true,
init: function(scope) {
scope.password = function() {
var value = this.getValue() || "";
return _.str.repeat('*', value.length);
};
},
template_readonly: '<input type="password" ng-show="text" tabindex="-1" readonly="readonly" class="display-text" value="{{password()}}"></input>',
template_editable: '<input type="password" autocomplete="new-password">'
});
ui.directive('uiTextareaAutoSize', function () {
return function (scope, element, attrs) {
if (!element.is('textarea')) return;
function resize() {
var diff = element.outerHeight() - element.innerHeight();
element.css('height', 'auto').css('height', element[0].scrollHeight + diff);
}
element.on('focus keyup input', resize);
setTimeout(resize);
};
});
})();