235 lines
6.2 KiB
JavaScript
235 lines
6.2 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');
|
|
|
|
var currencySymbols = {
|
|
en: '\u0024',
|
|
fr: '\u20AC'
|
|
};
|
|
|
|
var thousandSeparator = {
|
|
en: ',',
|
|
fr: ' '
|
|
};
|
|
|
|
function addCurrency(value, symbol) {
|
|
if (value && symbol) {
|
|
var val = '' + value;
|
|
if (axelor.config['user.lang'] === 'fr' ) {
|
|
return val.endsWith(symbol) ? val : val + ' ' + symbol;
|
|
}
|
|
return val.startsWith(symbol) ? val : symbol + val;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
function canSetNested(record, name) {
|
|
if (record && name && name in record) {
|
|
return true;
|
|
}
|
|
if (name) {
|
|
var path = name.split('.');
|
|
var val = record || {};
|
|
var idx = 0;
|
|
while (idx < path.length - 1) {
|
|
val = val[path[idx++]];
|
|
if (!val) return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function findNested(record, name) {
|
|
if (record && name && name in record) {
|
|
return record[name] === undefined ? null : record[name];
|
|
}
|
|
if (name) {
|
|
var path = name.split('.');
|
|
var val = record || {};
|
|
var idx = 0;
|
|
while (val && idx < path.length) {
|
|
val = val[path[idx++]];
|
|
}
|
|
if (idx === path.length) {
|
|
return val;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
function setNested(record, name, value) {
|
|
if (!record || !name) return record;
|
|
var path = name.split('.');
|
|
var nested = record;
|
|
var idx = -1;
|
|
while (++idx < path.length) {
|
|
var key = path[idx];
|
|
if (idx !== path.length - 1) {
|
|
nested = nested[key] || (nested[key] = {});
|
|
} else {
|
|
nested[key] = value;
|
|
}
|
|
}
|
|
return record;
|
|
}
|
|
|
|
// override angular.js currency filter
|
|
ui.filter('currency', function () {
|
|
return addCurrency;
|
|
});
|
|
|
|
function formatNumber(field, value, scale) {
|
|
var num = +(value);
|
|
if ((value === null || value === undefined) && !field.defaultValue) {
|
|
return value;
|
|
}
|
|
if (num === 0 || num) {
|
|
var lang = axelor.config['user.lang'];
|
|
var tsep = thousandSeparator[lang] || thousandSeparator.en;
|
|
return _.numberFormat(num, scale, '.', tsep);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
ui.findNested = findNested;
|
|
ui.setNested = setNested;
|
|
ui.canSetNested = canSetNested;
|
|
|
|
ui.formatters = {
|
|
|
|
"string": function(field, value, context) {
|
|
if (field.translatable && value && context) {
|
|
var key = '$t:' + field.name;
|
|
return context[key] || value;
|
|
}
|
|
return value;
|
|
},
|
|
|
|
"integer": function(field, value) {
|
|
return formatNumber(field, value);
|
|
},
|
|
|
|
"decimal": function(field, value, context) {
|
|
var scale = (field.widgetAttrs||{}).scale || field.scale || 2;
|
|
var currency = (field.widgetAttrs||{}).currency || field.currency;
|
|
|
|
var text = formatNumber(field, value, scale);
|
|
if (text && currency) {
|
|
text = addCurrency(text, findNested(context, currency));
|
|
}
|
|
return text;
|
|
},
|
|
|
|
"boolean": function(field, value) {
|
|
return value;
|
|
},
|
|
|
|
"duration": function(field, value) {
|
|
return ui.formatDuration(field, value);
|
|
},
|
|
|
|
"date": function(field, value) {
|
|
return value ? moment(value).format('DD/MM/YYYY') : "";
|
|
},
|
|
|
|
"time": function(field, value) {
|
|
return value ? value : "";
|
|
},
|
|
|
|
"datetime": function(field, value) {
|
|
return value ? moment(value).format('DD/MM/YYYY HH:mm') : "";
|
|
},
|
|
|
|
"many-to-one": function(field, value) {
|
|
return value
|
|
? (field.targetName ? value[field.targetName] : (value.name || value.code || value.id || ""))
|
|
: "";
|
|
},
|
|
|
|
"one-to-many": function(field, value) {
|
|
return value ? '(' + value.length + ')' : "";
|
|
},
|
|
|
|
"many-to-many": function(field, value) {
|
|
return value ? '(' + value.length + ')' : "";
|
|
},
|
|
|
|
"selection": function(field, value) {
|
|
var cmp = field.type === "integer" ? function(a, b) { return a == b ; } : _.isEqual;
|
|
var res = _.find(field.selectionList, function(item){
|
|
return cmp(item.value, value);
|
|
}) || {};
|
|
return res.title;
|
|
}
|
|
};
|
|
|
|
ui.formatters["enum"] = ui.formatters.selection;
|
|
|
|
function findField(scope, name) {
|
|
if (scope.field && scope.field.target) {
|
|
return ((scope.field.viewer||{}).fields||{})[name]
|
|
|| ((scope.field.editor||{}).fields||{})[name];
|
|
}
|
|
return (scope.viewItems || scope.fields || {})[name];
|
|
}
|
|
|
|
ui.formatters.$image = function (scope, fieldName, imageName) {
|
|
var record = scope.record || {};
|
|
var model = scope._model;
|
|
|
|
if (fieldName) {
|
|
var field = (scope.fields||{})[fieldName];
|
|
if (field && field.target) {
|
|
record = record[fieldName] || {};
|
|
model = field.target;
|
|
}
|
|
}
|
|
|
|
var v = record.version || record.$version || 0;
|
|
var n = record.id;
|
|
if (n > 0) {
|
|
return "ws/rest/" + model + "/" + n + "/" + imageName + "/download?image=true&v=" + v
|
|
+ "&parentId=" + scope.record.id + "&parentModel=" + scope._model;
|
|
}
|
|
return "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
|
|
};
|
|
|
|
ui.formatters.$fmt = function (scope, fieldName, fieldValue, record) {
|
|
var context = record || scope.record || {};
|
|
var value = arguments.length === 2 ? context[fieldName] : fieldValue;
|
|
if (value === undefined || value === null) {
|
|
return "";
|
|
}
|
|
var field = findField(scope, fieldName);
|
|
if (!field) {
|
|
return value;
|
|
}
|
|
var type = field.selection ? "selection" : field.type;
|
|
var formatter = ui.formatters[type];
|
|
if (formatter) {
|
|
return formatter(field, value, context);
|
|
}
|
|
return value;
|
|
};
|
|
|
|
})();
|