diff options
| author | Géry Debongnie <ged@odoo.com> | 2015-03-09 16:34:27 +0100 |
|---|---|---|
| committer | Géry Debongnie <ged@odoo.com> | 2015-03-18 09:01:49 +0100 |
| commit | e8a00bc50da435d3859118ca127d20a2eb9a0cab (patch) | |
| tree | 039f6ec40b37392e76c8830a8e518ac40f7e7fec /addons/web/static/src/js/widgets/sidebar.js | |
| parent | 9036084f065c7aca3b2199903f4da67db3501ba7 (diff) | |
[REF] web: add module system to the web client
This commit introduces a new module system for the javascript code.
Instead of using global (namespaced) variables everywhere (like
openerp.web.whatever, ...), each file declare one (or more) module
with its dependencies. Each module will be loaded after its
dependencies, and will be given a reference to the return values.
This change is a massive departure from the way the client worked
previously. It will sadly break some/most history, but I am sure that
the future git ecosystem will allow you to easily browse the history
past this revision (one can dream).
This commit feature:
* main namespace is now odoo instead of openerp
* a way to define modules and dependencies (inspired by requirejs)
* many files have been splitted in simpler subfiles
* basic support for debugging in odoo.__DEBUG__
* no global variable (i.e. nothing in window.openerp)
* many bug fixes, many new bugs
Future vision: this modularization should simplify future code
development, simplify debugging and will allow a serious testing effort
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; + +}); + |
