summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
authorXavier Morel <xmo@openerp.com>2012-01-10 16:51:06 +0100
committerXavier Morel <xmo@openerp.com>2012-01-10 16:51:06 +0100
commit8fd07cc0b802c5bc6290a0d2bed23ecb00e9ac03 (patch)
tree5cef0aa4f22e8774c3a8ce724489dcf634cede0e /addons/web/static/src/js
parent658a8e97c0543a16bc93aa461293127017087d4d (diff)
parentd54a19681110663aa8016f73b70c1663cc2a2b10 (diff)
[ADD] handling of binary fields in list views
lp bug: https://launchpad.net/bugs/914267 fixed bzr revid: xmo@openerp.com-20120110155106-p3g85wbh5g4wlbdi
Diffstat (limited to 'addons/web/static/src/js')
-rw-r--r--addons/web/static/src/js/formats.js56
-rw-r--r--addons/web/static/src/js/view_form.js2
-rw-r--r--addons/web/static/src/js/view_list.js22
3 files changed, 62 insertions, 18 deletions
diff --git a/addons/web/static/src/js/formats.js b/addons/web/static/src/js/formats.js
index 2418439ac46..819301f9e55 100644
--- a/addons/web/static/src/js/formats.js
+++ b/addons/web/static/src/js/formats.js
@@ -237,7 +237,15 @@ openerp.web.auto_date_to_str = function(value, type) {
};
/**
- * Formats a provided cell based on its field type
+ * Formats a provided cell based on its field type. Most of the field types
+ * return a correctly formatted value, but some tags and fields are
+ * special-cased in their handling:
+ *
+ * * buttons will return an actual ``<button>`` tag with a bunch of error handling
+ *
+ * * boolean fields will return a checkbox input, potentially disabled
+ *
+ * * binary fields will return a link to download the binary data as a file
*
* @param {Object} row_data record whose values should be displayed in the cell
* @param {Object} column column descriptor
@@ -245,21 +253,21 @@ openerp.web.auto_date_to_str = function(value, 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``
- * @param {Boolean} [process_modifiers=true] should the modifiers be computed ?
+ * @param {Object} [options]
+ * @param {String} [options.value_if_empty=''] what to display if the field's value is ``false``
+ * @param {Boolean} [options.process_modifiers=true] should the modifiers be computed ?
+ * @param {String} [options.model] current record's model
+ * @param {Number} [options.id] current record's id
+ *
*/
-openerp.web.format_cell = function (row_data, column, value_if_empty, process_modifiers) {
+openerp.web.format_cell = function (row_data, column, options) {
+ options = options || {};
var attrs = {};
- if (process_modifiers !== false) {
+ if (options.process_modifiers !== false) {
attrs = column.modifiers_for(row_data);
}
if (attrs.invisible) { return ''; }
- if (column.type === "boolean") {
- return _.str.sprintf('<input type="checkbox" %s disabled="disabled"/>',
- row_data[column.id].value ? 'checked="checked"' : '');
- }
-
if (column.tag === 'button') {
return _.template('<button type="button" title="<%-title%>" <%=additional_attributes%> >' +
'<img src="<%-prefix%>/web/static/src/img/icons/<%-icon%>.png" alt="<%-alt%>"/>' +
@@ -269,14 +277,36 @@ openerp.web.format_cell = function (row_data, column, value_if_empty, process_mo
'disabled="disabled" class="oe-listview-button-disabled"' : '',
prefix: openerp.connection.prefix,
icon: column.icon,
- alt: column.string || '',
+ alt: column.string || ''
});
}
if (!row_data[column.id]) {
- return value_if_empty === undefined ? '' : value_if_empty;
+ return options.value_if_empty === undefined ? '' : options.value_if_empty;
}
+
+ switch (column.type) {
+ case "boolean":
+ return _.str.sprintf('<input type="checkbox" %s disabled="disabled"/>',
+ row_data[column.id].value ? 'checked="checked"' : '');
+ case "binary":
+ var text = _t("Download"),
+ download_url = _.str.sprintf('/web/binary/saveas?session_id=%s&model=%s&field=%s&id=%d', openerp.connection.session_id, options.model, column.id, options.id);
+ if (column.filename) {
+ download_url += '&filename_field=' + column.filename;
+ if (row_data[column.filename]) {
+ text = _.str.sprintf(_t("Download \"%s\""), openerp.web.format_value(
+ row_data[column.filename].value, {type: 'char'}));
+ }
+ }
+ return _.str.sprintf('<a href="%(href)s">%(text)s</a> (%(size)s)', {
+ text: text,
+ href: download_url,
+ size: row_data[column.id].value
+ });
+ }
+
return openerp.web.format_value(
- row_data[column.id].value, column, value_if_empty);
+ row_data[column.id].value, column, options.value_if_empty);
}
};
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 622f9bba68d..89b3a97b6ed 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -3009,7 +3009,7 @@ openerp.web.form.FieldBinary = openerp.web.form.Field.extend({
on_save_as: function() {
var url = '/web/binary/saveas?session_id=' + this.session.session_id + '&model=' +
this.view.dataset.model +'&id=' + (this.view.datarecord.id || '') + '&field=' + this.name +
- '&fieldname=' + (this.node.attrs.filename || '') + '&t=' + (new Date().getTime());
+ '&filename_field=' + (this.node.attrs.filename || '') + '&t=' + (new Date().getTime());
window.open(url);
},
on_clear: function() {
diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js
index 1c4911974fe..70ae337b903 100644
--- a/addons/web/static/src/js/view_list.js
+++ b/addons/web/static/src/js/view_list.js
@@ -685,6 +685,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
this.display_aggregates(aggregates);
},
display_aggregates: function (aggregation) {
+ var self = this;
var $footer_cells = this.$element.find('.oe-list-footer');
_(this.aggregate_columns).each(function (column) {
if (!column['function']) {
@@ -692,7 +693,10 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
}
$footer_cells.filter(_.str.sprintf('[data-field=%s]', column.id))
- .html(openerp.web.format_cell(aggregation, column, undefined, false));
+ .html(openerp.web.format_cell(aggregation, column, {
+ process_modifiers: false,
+ model: self.dataset.model
+ }));
});
},
get_selected_ids: function() {
@@ -846,6 +850,9 @@ openerp.web.ListView.List = openerp.web.Class.extend( /** @lends openerp.web.Lis
return self.reload_record(self.records.get(record_id));
}]);
})
+ .delegate('a', 'click', function (e) {
+ e.stopPropagation();
+ })
.delegate('tr', 'click', function (e) {
e.stopPropagation();
var row_id = self.row_id(e.currentTarget);
@@ -905,7 +912,10 @@ openerp.web.ListView.List = openerp.web.Class.extend( /** @lends openerp.web.Lis
});
}
}
- return openerp.web.format_cell(record.toForm().data, column);
+ return openerp.web.format_cell(record.toForm().data, column, {
+ model: this.dataset.model,
+ id: record.get('id')
+ });
},
render: function () {
if (this.$current) {
@@ -1211,7 +1221,11 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
return column.id === group.grouped_on; });
try {
$group_column.html(openerp.web.format_cell(
- row_data, group_column, _t("Undefined"), false));
+ row_data, group_column, {
+ value_if_empty: _t("Undefined"),
+ process_modifiers: false,
+ model: self.dataset.model
+ }));
} catch (e) {
$group_column.html(row_data[group_column.id].value);
}
@@ -1289,7 +1303,7 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
page = this.datagroup.openable ? this.page : view.page;
var fields = _.pluck(_.select(this.columns, function(x) {return x.tag == "field"}), 'name');
- var options = { offset: page * limit, limit: limit };
+ var options = { offset: page * limit, limit: limit, context: {bin_size: true} };
//TODO xmo: investigate why we need to put the setTimeout
$.async_when().then(function() {dataset.read_slice(fields, options , function (records) {
// FIXME: ignominious hacks, parents (aka form view) should not send two ListView#reload_content concurrently