diff options
Diffstat (limited to 'addons/web/static/src/js/formats.js')
| -rw-r--r-- | addons/web/static/src/js/formats.js | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/addons/web/static/src/js/formats.js b/addons/web/static/src/js/formats.js new file mode 100644 index 00000000000..b0dc4fcc289 --- /dev/null +++ b/addons/web/static/src/js/formats.js @@ -0,0 +1,197 @@ + +openerp.web.formats = function(openerp) { + +/** + * Formats a single atomic value based on a field descriptor + * + * @param {Object} value read from OpenERP + * @param {Object} descriptor union of orm field and view field + * @param {Object} [descriptor.widget] widget to use to display the value + * @param {Object} descriptor.type fallback if no widget is provided, or if the provided widget is unknown + * @param {Object} [descriptor.digits] used for the formatting of floats + * @param {String} [value_if_empty=''] returned if the ``value`` argument is considered empty + */ +openerp.web.format_value = function (value, descriptor, value_if_empty) { + // If NaN value, display as with a `false` (empty cell) + if (typeof value === 'number' && isNaN(value)) { + value = false; + } + switch (value) { + case false: + case Infinity: + case -Infinity: + return value_if_empty === undefined ? '' : value_if_empty; + } + switch (descriptor.widget || descriptor.type) { + case 'integer': + return _.sprintf('%d', value); + case 'float': + var precision = descriptor.digits ? descriptor.digits[1] : 2; + var int_part = Math.floor(value); + var dec_part = Math.abs(Math.floor((value % 1) * Math.pow(10, precision))); + return _.sprintf('%d%s%d', + int_part, + openerp.web._t.database.parameters.decimal_point, dec_part); + case 'float_time': + return _.sprintf("%02d:%02d", + Math.floor(value), + Math.round((value % 1) * 60)); + case 'progressbar': + return _.sprintf( + '<progress value="%.2f" max="100.0">%.2f%%</progress>', + value, value); + case 'many2one': + // name_get value format + return value[1]; + case 'datetime': + if (typeof(value) == "string") + value = openerp.web.auto_str_to_date(value); + try { + return value.toString(_.sprintf("%s %s", Date.CultureInfo.formatPatterns.shortDate, + Date.CultureInfo.formatPatterns.longTime)); + } catch (e) { + return value.format("%m/%d/%Y %H:%M:%S"); + } + return value; + case 'date': + if (typeof(value) == "string") + value = openerp.web.auto_str_to_date(value); + try { + return value.toString(Date.CultureInfo.formatPatterns.shortDate); + } catch (e) { + return value.format("%m/%d/%Y"); + } + case 'time': + if (typeof(value) == "string") + value = openerp.web.auto_str_to_date(value); + try { + return value.toString(Date.CultureInfo.formatPatterns.longTime); + } catch (e) { + return value.format("%H:%M:%S"); + } + default: + return value; + } +}; + +openerp.web.parse_value = function (value, descriptor, value_if_empty) { + switch (value) { + case false: + case "": + return value_if_empty === undefined ? false : value_if_empty; + } + switch (descriptor.widget || descriptor.type) { + case 'integer': + var tmp = Number(value); + if (isNaN(tmp)) + throw value + " is not a correct integer"; + return tmp; + case 'float': + var tmp = Number(value); + if (!isNaN(tmp)) + return tmp; + tmp = value.replace(openerp.web._t.database.parameters.decimal_point, "."); + var tmp2 = tmp; + do { + tmp = tmp2; + tmp2 = tmp.replace(openerp.web._t.database.parameters.thousands_sep, ""); + } while(tmp !== tmp2); + tmp = Number(tmp); + if (isNaN(tmp)) + throw value + " is not a correct float"; + return tmp; + case 'float_time': + var tmp = value.split(":"); + if (tmp.length != 2) + throw value + " is not a correct float_time"; + var tmp1 = openerp.web.parse_value(tmp[0], {type: "integer"}); + var tmp2 = openerp.web.parse_value(tmp[1], {type: "integer"}); + return tmp1 + (tmp2 / 60); + case 'progressbar': + return openerp.web.parse_value(value, {type: "float"}); + case 'datetime': + var tmp = Date.parseExact(value, _.sprintf("%s %s", Date.CultureInfo.formatPatterns.shortDate, + Date.CultureInfo.formatPatterns.longTime)); + if (tmp !== null) + return tmp; + tmp = Date.parse(value); + if (tmp !== null) + return tmp; + throw value + " is not a valid datetime"; + case 'date': + var tmp = Date.parseExact(value, Date.CultureInfo.formatPatterns.shortDate); + if (tmp !== null) + return tmp; + tmp = Date.parse(value); + if (tmp !== null) + return tmp; + throw value + " is not a valid date"; + case 'time': + var tmp = Date.parseExact(value, Date.CultureInfo.formatPatterns.longTime); + if (tmp !== null) + return tmp; + tmp = Date.parse(value); + if (tmp !== null) + return tmp; + throw value + " is not a valid time"; + } + return value; +}; + +openerp.web.auto_str_to_date = function(value, type) { + try { + return openerp.web.str_to_datetime(value); + } catch(e) {} + try { + return openerp.web.str_to_date(value); + } catch(e) {} + try { + return openerp.web.str_to_time(value); + } catch(e) {} + throw "'" + value + "' is not a valid date, datetime nor time" +}; + +openerp.web.auto_date_to_str = function(value, type) { + switch(type) { + case 'datetime': + return openerp.web.datetime_to_str(value); + case 'date': + return openerp.web.date_to_str(value); + case 'time': + return openerp.web.time_to_str(value); + default: + throw type + " is not convertible to date, datetime nor time" + } +}; + +/** + * Formats a provided cell based on its field type + * + * @param {Object} row_data record whose values should be displayed in the cell + * @param {Object} column column descriptor + * @param {"button"|"field"} column.tag base control type + * @param {String} column.type widget type for a field control + * @param {String} [column.string] button label + * @param {String} [column.icon] button icon + * @param {String} [value_if_empty=''] what to display if the field's value is ``false`` + */ +openerp.web.format_cell = function (row_data, column, value_if_empty) { + var attrs = column.modifiers_for(row_data); + if (attrs.invisible) { return ''; } + if (column.tag === 'button') { + return [ + '<button type="button" title="', column.string || '', '">', + '<img src="/web/static/src/img/icons/', column.icon, '.png"', + ' alt="', column.string || '', '"/>', + '</button>' + ].join('') + } + + if (!row_data[column.id]) { + return value_if_empty === undefined ? '' : value_if_empty; + } + return openerp.web.format_value( + row_data[column.id].value, column, value_if_empty); +} + +}; |
