diff options
Diffstat (limited to 'addons/web/static/src/js/widgets/sidebar.js')
| -rw-r--r-- | addons/web/static/src/js/widgets/sidebar.js | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/addons/web/static/src/js/widgets/sidebar.js b/addons/web/static/src/js/widgets/sidebar.js new file mode 100644 index 00000000000..7005ec2012e --- /dev/null +++ b/addons/web/static/src/js/widgets/sidebar.js @@ -0,0 +1,215 @@ +odoo.define('web.Sidebar', ['web.core', 'web.data', 'web.Dialog', 'web.framework', 'web.pyeval', 'web.session', 'web.Widget'], 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) { + var self = this; + this._super(parent); + this.sections = [ + { 'name' : 'print', 'label' : _t('Print'), }, + { 'name' : 'other', 'label' : _t('More'), } + ]; + this.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',}, $("<div />").text(_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) { + var self = this; + var prefix = session.url('/web/binary/saveas', {model: 'ir.attachment', field: 'datas', filename_field: 'name'}); + _.each(attachments,function(a) { + a.label = a.name; + if(a.type === "binary") { + a.url = prefix + '&id=' + a.id + '&t=' + (new Date().getTime()); + } + }); + self.items.files = attachments; + self.redraw(); + this.$('.oe_sidebar_add_attachment .oe_form_binary_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.oe_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; + +}); + |
