[MERGE] from trunk
[odoo/odoo.git] / addons / base / static / src / js / formats.js
1
2 openerp.base.formats = function(openerp) {
3
4 /**
5  * Formats a single atomic value based on a field descriptor
6  *
7  * @param {Object} value read from OpenERP
8  * @param {Object} descriptor union of orm field and view field
9  * @param {Object} [descriptor.widget] widget to use to display the value
10  * @param {Object} descriptor.type fallback if no widget is provided, or if the provided widget is unknown
11  * @param {Object} [descriptor.digits] used for the formatting of floats
12  * @param {String} [value_if_empty=''] returned if the ``value`` argument is considered empty
13  */
14 openerp.base.format_value = function (value, descriptor, value_if_empty) {
15     // If NaN value, display as with a `false` (empty cell)
16     if (typeof value === 'number' && isNaN(value)) {
17         value = false;
18     }
19     switch (value) {
20         case false:
21         case Infinity:
22         case -Infinity:
23             return value_if_empty === undefined ?  '' : value_if_empty;
24     }
25     switch (descriptor.widget || descriptor.type) {
26         case 'integer':
27             return _.sprintf('%d', value);
28         case 'float':
29             var precision = descriptor.digits ? descriptor.digits[1] : 2;
30             var int_part = Math.floor(value);
31             var dec_part = Math.floor((value % 1) * Math.pow(10, precision));
32             return _.sprintf('%d' + openerp.base._t.database.parameters.decimal_point + '%d', int_part, dec_part);
33         case 'float_time':
34             return _.sprintf("%02d:%02d",
35                     Math.floor(value),
36                     Math.round((value % 1) * 60));
37         case 'progressbar':
38             return _.sprintf(
39                 '<progress value="%.2f" max="100.0">%.2f%%</progress>',
40                     value, value);
41         case 'many2one':
42             // name_get value format
43             return value[1];
44         case 'datetime':
45             if (typeof(value) == "string")
46                 value = openerp.base.str_to_datetime(value);
47             try {
48                 return value.format(_.sprintf("%s %s", openerp.base._t.database.parameters.date_format, 
49                     openerp.base._t.database.parameters.time_format));
50             } catch (e) {
51                 return value.format("%m/%d/%Y %H:%M:%S");
52             }
53             return value;
54         case 'date':
55             if (typeof(value) == "string")
56                 value = openerp.base.str_to_date(value);
57             try {
58                 return value.format(openerp.base._t.database.parameters.date_format);
59             } catch (e) {
60                 return value.format("%m/%d/%Y");
61             }
62         case 'time':
63             if (typeof(value) == "string")
64                 value = openerp.base.str_to_time(value);
65             try {
66                 return value.format(openerp.base._t.database.parameters.time_format);
67             } catch (e) {
68                 return value.format("%H:%M:%S");
69             }
70         default:
71             return value;
72     }
73 };
74
75 openerp.base.parse_value = function (value, descriptor, value_if_empty) {
76     switch (value) {
77         case false:
78         case "":
79             return value_if_empty === undefined ?  false : value_if_empty;
80     }
81     switch (descriptor.widget || descriptor.type) {
82         case 'integer':
83             var tmp = Number(value);
84             if (isNaN(tmp))
85                 throw value + " is not a correct integer";
86             return tmp;
87         case 'float':
88             var tmp = Number(value);
89             if (!isNaN(tmp))
90                 return tmp;
91             tmp = value.replace(openerp.base._t.database.parameters.decimal_point, ".");
92             var tmp2 = tmp;
93             do {
94                 tmp = tmp2;
95                 tmp2 = tmp.replace(openerp.base._t.database.parameters.thousands_sep, "");
96             } while(tmp !== tmp2);
97             tmp = Number(tmp);
98             if (isNaN(tmp))
99                 throw value + " is not a correct float";
100             return tmp;
101         case 'float_time':
102             var tmp = value.split(":");
103             if (tmp.length != 2)
104                 throw value + " is not a correct float_time";
105             var tmp1 = openerp.base.parse_value(tmp[0], {type: "integer"});
106             var tmp2 = openerp.base.parse_value(tmp[1], {type: "integer"});
107             return tmp1 + (tmp2 / 60);
108         case 'progressbar':
109             return openerp.base.parse_value(value, {type: "float"});
110         case 'datetime':
111             var tmp = Date.parse(value);
112             if (tmp !== null)
113                 return tmp;
114             throw value + " is not a valid datetime";
115         case 'date':
116             var tmp = Date.parse(value);
117             if (tmp !== null)
118                 return tmp;
119             throw value + " is not a valid date";
120         case 'time':
121             var tmp = Date.parse(value);
122             if (tmp !== null)
123                 return tmp;
124             throw value + " is not a valid time";
125     }
126     return value;
127 };
128
129 /**
130  * Formats a provided cell based on its field type
131  *
132  * @param {Object} row_data record whose values should be displayed in the cell
133  * @param {Object} column column descriptor
134  * @param {"button"|"field"} column.tag base control type
135  * @param {String} column.type widget type for a field control
136  * @param {String} [column.string] button label
137  * @param {String} [column.icon] button icon
138  * @param {String} [value_if_empty=''] what to display if the field's value is ``false``
139  */
140 openerp.base.format_cell = function (row_data, column, value_if_empty) {
141     var attrs = column.modifiers_for(row_data);
142     if (attrs.invisible) { return ''; }
143     if (column.tag === 'button') {
144         return [
145             '<button type="button" title="', column.string || '', '">',
146                 '<img src="/base/static/src/img/icons/', column.icon, '.png"',
147                     ' alt="', column.string || '', '"/>',
148             '</button>'
149         ].join('')
150     }
151
152     if (!row_data[column.id]) {
153         return value_if_empty === undefined ? '' : value_if_empty;
154     }
155     return openerp.base.format_value(
156             row_data[column.id].value, column, value_if_empty);
157 }
158     
159 };