Files
odoo_source/addons/web/static/src/js/widgets/sidebar.js
T
Jérome Maes 8ffca19680 [FIX] web : attachment controller got unexpected args
On webclient, on 'Attachment(s)' dropdown (form view) when clicking on an attachment to download it, a request is sent to /web/content/ with a param 't' containing the current date. This param wasn't used neither before the new controller, but the old one accept additional kwargs. The new controller crashes, and since the t parameter is not used, removing it seems better.
2015-09-25 16:05:44 +02:00

217 lines
7.9 KiB
JavaScript

odoo.define('web.Sidebar', function (require) {
"use strict";
var core = require('web.core');
var data = require('web.data');
var Dialog = require('web.Dialog');
var framework = require('web.framework');
var pyeval = require('web.pyeval');
var session = require('web.session');
var Widget = require('web.Widget');
var QWeb = core.qweb;
var _t = core._t;
var Sidebar = Widget.extend({
init: function(parent, options) {
var self = this;
this._super(parent);
this.options = _.defaults(options || {}, {
'editable': true
});
this.sections = options.sections || [
{name: 'print', label: _t('Print')},
{name: 'other', label: _t('Action')},
];
this.items = options.items || {
print: [],
other: [],
};
this.fileupload_id = _.uniqueId('oe_fileupload');
$(window).on(this.fileupload_id, function() {
var args = [].slice.call(arguments).slice(1);
self.do_attachement_update(self.dataset, self.model_id,args);
framework.unblockUI();
});
},
start: function() {
var self = this;
this._super(this);
this.redraw();
this.$el.on('click','.dropdown-menu li a', function(event) {
var section = $(this).data('section');
var index = $(this).data('index');
var item = self.items[section][index];
if (item.callback) {
item.callback.apply(self, [item]);
} else if (item.action) {
self.on_item_action_clicked(item);
} else if (item.url) {
return true;
}
event.preventDefault();
});
},
redraw: function() {
var self = this;
self.$el.html(QWeb.render('Sidebar', {widget: self}));
// Hides Sidebar sections when item list is empty
this.$('.oe_form_dropdown_section').each(function() {
$(this).toggle(!!$(this).find('li').length);
});
self.$("[title]").tooltip({
delay: { show: 500, hide: 0}
});
},
/**
* For each item added to the section:
*
* ``label``
* will be used as the item's name in the sidebar, can be html
*
* ``action``
* descriptor for the action which will be executed, ``action`` and
* ``callback`` should be exclusive
*
* ``callback``
* function to call when the item is clicked in the sidebar, called
* with the item descriptor as its first argument (so information
* can be stored as additional keys on the object passed to
* ``add_items``)
*
* ``classname`` (optional)
* ``@class`` set on the sidebar serialization of the item
*
* ``title`` (optional)
* will be set as the item's ``@title`` (tooltip)
*
* @param {String} section_code
* @param {Array<{label, action | callback[, classname][, title]}>} items
*/
add_items: function(section_code, items) {
if (items) {
this.items[section_code].unshift.apply(this.items[section_code],items);
this.redraw();
}
},
add_toolbar: function(toolbar) {
var self = this;
_.each(['print','action','relate'], function(type) {
var items = toolbar[type];
if (items) {
for (var i = 0; i < items.length; i++) {
items[i] = {
label: items[i]['name'],
action: items[i],
classname: 'oe_sidebar_' + type
};
}
self.add_items(type=='print' ? 'print' : 'other', items);
}
});
},
on_item_action_clicked: function(item) {
var self = this;
self.getParent().sidebar_eval_context().done(function (sidebar_eval_context) {
var ids = self.getParent().get_selected_ids();
var domain;
if (self.getParent().get_active_domain) {
domain = self.getParent().get_active_domain();
}
else {
domain = $.Deferred().resolve(undefined);
}
if (ids.length === 0) {
new Dialog(this, {title: _t("Warning"), size: 'medium', $content: $("<div/>").html(_t("You must choose at least one record."))}).open();
return false;
}
var dataset = self.getParent().dataset;
var active_ids_context = {
active_id: ids[0],
active_ids: ids,
active_model: dataset.model,
};
$.when(domain).done(function (domain) {
if (domain !== undefined) {
active_ids_context.active_domain = domain;
}
var c = pyeval.eval('context',
new data.CompoundContext(
sidebar_eval_context, active_ids_context));
self.rpc("/web/action/load", {
action_id: item.action.id,
context: new data.CompoundContext(
dataset.get_context(), active_ids_context).eval()
}).done(function(result) {
result.context = new data.CompoundContext(
result.context || {}, active_ids_context)
.set_eval_context(c);
result.flags = result.flags || {};
result.flags.new_window = true;
self.do_action(result, {
on_close: function() {
// reload view
self.getParent().reload();
},
});
});
});
});
},
do_attachement_update: function(dataset, model_id, args) {
this.dataset = dataset;
this.model_id = model_id;
if (args && args[0].error) {
this.do_warn(_t('Uploading Error'), args[0].error);
}
if (!model_id) {
this.on_attachments_loaded([]);
} else {
var dom = [ ['res_model', '=', dataset.model], ['res_id', '=', model_id], ['type', 'in', ['binary', 'url']] ];
var ds = new data.DataSetSearch(this, 'ir.attachment', dataset.get_context(), dom);
ds.read_slice(['name', 'url', 'type', 'create_uid', 'create_date', 'write_uid', 'write_date'], {}).done(this.on_attachments_loaded);
}
},
on_attachments_loaded: function(attachments) {
_.each(attachments,function(a) {
a.label = a.name;
if(a.type === "binary") {
a.url = '/web/content/' + a.id + '?download=true';
}
});
this.items.files = attachments;
this.redraw();
this.$('.oe_sidebar_add_attachment .o_form_input_file').change(this.on_attachment_changed);
this.$el.find('.oe_sidebar_delete_item').click(this.on_attachment_delete);
},
on_attachment_changed: function(e) {
var $e = $(e.target);
if ($e.val() !== '') {
this.$el.find('form.o_form_binary_form').submit();
$e.parent().find('input[type=file]').prop('disabled', true);
$e.parent().find('button').prop('disabled', true).find('img, span').toggle();
this.$('.oe_sidebar_add_attachment a').text(_t('Uploading...'));
framework.blockUI();
}
},
on_attachment_delete: function(e) {
e.preventDefault();
e.stopPropagation();
var self = this;
var $e = $(e.currentTarget);
if (confirm(_t("Do you really want to delete this attachment ?"))) {
(new data.DataSet(this, 'ir.attachment')).unlink([parseInt($e.attr('data-id'), 10)]).done(function() {
self.do_attachement_update(self.dataset, self.model_id);
});
}
}
});
return Sidebar;
});