[FIX] handling of date and time formats with bare/literal characters

lp bug: https://launchpad.net/bugs/932448 fixed

bzr revid: xmo@openerp.com-20120215153237-4q1y6snebxk6sheh
This commit is contained in:
Xavier Morel 2012-02-15 16:32:37 +01:00
parent 288f7c7892
commit a01c57c31f
2 changed files with 53 additions and 6 deletions

View File

@ -61,6 +61,28 @@ openerp.web.insert_thousand_seps = function (num) {
return (negative ? '-' : '') + openerp.web.intersperse(
num, _t.database.parameters.grouping, _t.database.parameters.thousands_sep);
};
/**
* removes literal (non-format) text from a date or time pattern, as datejs can
* not deal with literal text in format strings (whatever the format), whereas
* strftime allows for literal characters
*
* @param {String} value original format
*/
openerp.web.strip_raw_chars = function (value) {
var isletter = /[a-zA-Z]/, output = [];
for(var index=0; index < value.length; ++index) {
var character = value[index];
if(isletter.test(character) && (index === 0 || value[index-1] !== '%')) {
continue;
}
output.push(character);
}
return output.join('');
};
var normalize_format = function (format) {
return Date.normalizeFormat(openerp.web.strip_raw_chars(format));
};
/**
* Formats a single atomic value based on a field descriptor
*
@ -116,16 +138,16 @@ openerp.web.format_value = function (value, descriptor, value_if_empty) {
if (typeof(value) == "string")
value = openerp.web.auto_str_to_date(value);
return value.format(l10n.date_format
+ ' ' + l10n.time_format);
return value.toString(normalize_format(l10n.date_format)
+ ' ' + normalize_format(l10n.time_format));
case 'date':
if (typeof(value) == "string")
value = openerp.web.auto_str_to_date(value);
return value.format(l10n.date_format);
return value.toString(normalize_format(l10n.date_format));
case 'time':
if (typeof(value) == "string")
value = openerp.web.auto_str_to_date(value);
return value.format(l10n.time_format);
return value.toString(normalize_format(l10n.time_format));
case 'selection':
// Each choice is [value, label]
if(_.isArray(value)) {
@ -142,8 +164,8 @@ openerp.web.format_value = function (value, descriptor, value_if_empty) {
};
openerp.web.parse_value = function (value, descriptor, value_if_empty) {
var date_pattern = Date.normalizeFormat(_t.database.parameters.date_format),
time_pattern = Date.normalizeFormat(_t.database.parameters.time_format);
var date_pattern = normalize_format(_t.database.parameters.date_format),
time_pattern = normalize_format(_t.database.parameters.time_format);
switch (value) {
case false:
case "":

View File

@ -204,4 +204,29 @@ $(document).ready(function () {
equal(openerp.web.format_value(6000, {type: 'float'}),
'6.000,00');
});
module('custom-date-formats', {
setup: function () {
openerp = window.openerp.init();
window.openerp.web.core(openerp);
window.openerp.web.dates(openerp);
window.openerp.web.formats(openerp);
}
});
test('format stripper', function () {
strictEqual(openerp.web.strip_raw_chars('%a, %Y %b %d'), '%a, %Y %b %d');
strictEqual(openerp.web.strip_raw_chars('%a, %Y.eko %bren %da'), '%a, %Y. %b %d');
});
test('ES date format', function () {
openerp.web._t.database.parameters.date_format = '%a, %Y %b %d';
var date = openerp.web.str_to_date("2009-05-04");
strictEqual(openerp.web.format_value(date, {type:"date"}), 'Mon, 2009 May 04');
strictEqual(openerp.web.parse_value('Mon, 2009 May 04', {type: 'date'}), '2009-05-04');
});
test('extended ES date format', function () {
openerp.web._t.database.parameters.date_format = '%a, %Y.eko %bren %da';
var date = openerp.web.str_to_date("2009-05-04");
strictEqual(openerp.web.format_value(date, {type:"date"}), 'Mon, 2009. May 04');
strictEqual(openerp.web.parse_value('Mon, 2009. May 04', {type: 'date'}), '2009-05-04');
});
});