summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/widgets
diff options
context:
space:
mode:
authorAaron Bohy <aab@odoo.com>2015-02-12 18:03:27 +0100
committerAaron Bohy <aab@odoo.com>2015-03-20 16:18:35 +0100
commit7aa08364200936883b62a8389a5da714d0a40d6b (patch)
tree5c05fbb914d2dc531ed77ef1ea4700f11a406b84 /addons/web/static/src/js/widgets
parent151c90743efd374e72bf1b18f5ae0c392a3811ac (diff)
[IMP] Web: views.js, view_editor.js: DebugManager
Creation of a widget for the DebugManager and move it from the ControlPanel to the Systray. Refactoring of the widget to improve/facilitate the way of adding options in the DebugManager as the view_editor does. Add a do_action() function in the WebClient that forwards the action to the main ActionManager so that widget that are not in the scope of the ActionManager (e.g. Menu) can performed actions as well. Note: The DebugManager is currently in the Systray but it will finally be moved to a dedicated spot above the ControlPanel.
Diffstat (limited to 'addons/web/static/src/js/widgets')
-rw-r--r--addons/web/static/src/js/widgets/debug_manager.js225
1 files changed, 225 insertions, 0 deletions
diff --git a/addons/web/static/src/js/widgets/debug_manager.js b/addons/web/static/src/js/widgets/debug_manager.js
new file mode 100644
index 00000000000..4fffdab9294
--- /dev/null
+++ b/addons/web/static/src/js/widgets/debug_manager.js
@@ -0,0 +1,225 @@
+odoo.define('web.DebugManager', function (require) {
+"use strict";
+
+var core = require('web.core');
+var Dialog = require('web.Dialog');
+var formats = require('web.formats');
+var framework = require('web.framework');
+var session = require('web.session');
+var SystrayMenu = require('web.SystrayMenu');
+var utils = require('web.utils');
+var ViewManager = require('web.ViewManager');
+var Widget = require('web.Widget');
+
+var QWeb = core.qweb;
+var _t = core._t;
+
+if (core.debug) {
+ var DebugManager = Widget.extend({
+ template: "WebClient.DebugManager",
+ events: {
+ "click .oe_debug_button": "render_dropdown",
+ "click .js_debug_dropdown li": "on_debug_click",
+ },
+ start: function() {
+ this._super();
+ this.$dropdown = this.$(".js_debug_dropdown");
+ },
+ /**
+ * Updates its attributes according to the current state of the ActionManager
+ */
+ _update_state: function() {
+ this.view_manager = odoo.__DEBUG__.services['web.web_client'].action_manager.get_inner_widget();
+ if (!this.view_manager instanceof ViewManager) { return; }
+ this.dataset = this.view_manager.dataset;
+ this.active_view = this.view_manager.active_view;
+ if (!this.active_view) { return; }
+ this.view = this.active_view.controller;
+ return true;
+ },
+ /**
+ * Renders dropdown according to the current state
+ */
+ render_dropdown: function() {
+ var self = this;
+
+ // Empty the previously rendered dropdown
+ this.$dropdown.empty();
+
+ // Attempt to retrieve the current state of the ActionManager
+ if (!this._update_state()) {
+ // Disable the button when not available
+ console.warn("DebugManager is not available");
+ return;
+ }
+
+ // Render the dropdown and append it
+ var dropdown_content = QWeb.render('WebClient.DebugDropdown', {
+ widget: self,
+ active_view: self.active_view,
+ view: self.view,
+ action: self.view_manager.action,
+ searchview: self.view_manager.searchview,
+ uid: session.uid,
+ });
+ $(dropdown_content).appendTo(self.$dropdown);
+ },
+ /**
+ * Calls the appropriate callback when clicking on a Debug option
+ */
+ on_debug_click: function (evt) {
+ evt.preventDefault();
+
+ var params = $(evt.target).data();
+ var callback = params.action;
+
+ if (callback && this[callback]) {
+ // Perform the callback corresponding to the option
+ this[callback](params, evt);
+ } else {
+ console.warn("No debug handler for ", callback);
+ }
+ },
+ get_metadata: function() {
+ var self = this;
+ var ids = this.view.get_selected_ids();
+ if (ids.length === 1) {
+ self.dataset.call('get_metadata', [ids]).done(function(result) {
+ new Dialog(this, {
+ title: _.str.sprintf(_t("Metadata (%s)"), self.dataset.model),
+ size: 'medium',
+ buttons: {
+ Ok: function() { this.parents('.modal').modal('hide');}
+ },
+ }, QWeb.render('WebClient.DebugViewLog', {
+ perm : result[0],
+ format : formats.format_value
+ })).open();
+ });
+ }
+ },
+ toggle_layout_outline: function() {
+ this.view.rendering_engine.toggle_layout_debugging();
+ },
+ set_defaults: function() {
+ this.view.open_defaults_dialog();
+ },
+ perform_js_tests: function() {
+ this.do_action({
+ name: _t("JS Tests"),
+ target: 'new',
+ type : 'ir.actions.act_url',
+ url: '/web/tests?mod=*'
+ });
+ },
+ get_view_fields: function() {
+ var self = this;
+ self.dataset.call('fields_get', [false, {}]).done(function (fields) {
+ var $root = $('<dl>');
+ _(fields).each(function (attributes, name) {
+ $root.append($('<dt>').append($('<h4>').text(name)));
+ var $attrs = $('<dl>').appendTo($('<dd>').appendTo($root));
+ _(attributes).each(function (def, name) {
+ if (def instanceof Object) {
+ def = JSON.stringify(def);
+ }
+ $attrs
+ .append($('<dt>').text(name))
+ .append($('<dd style="white-space: pre-wrap;">').text(def));
+ });
+ });
+ new Dialog(self, {
+ title: _.str.sprintf(_t("Model %s fields"),
+ self.dataset.model),
+ buttons: {
+ Ok: function() { this.parents('.modal').modal('hide');}
+ },
+ }, $root).open();
+ });
+ },
+ fvg: function() {
+ var dialog = new Dialog(this, { title: _t("Fields View Get") }).open();
+ $('<pre>').text(utils.json_node_to_xml(this.view.fields_view.arch, true)).appendTo(dialog.$el);
+ },
+ manage_filters: function() {
+ this.do_action({
+ res_model: 'ir.filters',
+ name: _t('Manage Filters'),
+ views: [[false, 'list'], [false, 'form']],
+ type: 'ir.actions.act_window',
+ context: {
+ search_default_my_filters: true,
+ search_default_model_id: this.dataset.model
+ }
+ });
+ },
+ translate: function() {
+ this.do_action({
+ name: _t("Technical Translation"),
+ res_model : 'ir.translation',
+ domain : [['type', '!=', 'object'], '|', ['name', '=', this.dataset.model], ['name', 'ilike', this.dataset.model + ',']],
+ views: [[false, 'list'], [false, 'form']],
+ type : 'ir.actions.act_window',
+ view_type : "list",
+ view_mode : "list"
+ });
+ },
+ edit: function(params, evt) {
+ this.do_action({
+ res_model : params.model,
+ res_id : params.id,
+ name: evt.target.text,
+ type : 'ir.actions.act_window',
+ view_type : 'form',
+ view_mode : 'form',
+ views : [[false, 'form']],
+ target : 'new',
+ flags : {
+ action_buttons : true,
+ headless: true,
+ }
+ });
+ },
+ edit_workflow: function() {
+ return this.do_action({
+ res_model : 'workflow',
+ name: _t('Edit Workflow'),
+ domain : [['osv', '=', this.dataset.model]],
+ views: [[false, 'list'], [false, 'form'], [false, 'diagram']],
+ type : 'ir.actions.act_window',
+ view_type : 'list',
+ view_mode : 'list'
+ });
+ },
+ print_workflow: function() {
+ if (this.view.get_selected_ids && this.view.get_selected_ids().length == 1) {
+ framework.blockUI();
+ var action = {
+ context: { active_ids: this.view.get_selected_ids() },
+ report_name: "workflow.instance.graph",
+ datas: {
+ model: this.dataset.model,
+ id: this.view.get_selected_ids()[0],
+ nested: true,
+ }
+ };
+ this.session.get_file({
+ url: '/web/report',
+ data: {action: JSON.stringify(action)},
+ complete: framework.unblockUI
+ });
+ } else {
+ this.do_warn("Warning", "No record selected.");
+ }
+ },
+ leave_debug: function() {
+ window.location.search="?";
+ },
+ });
+
+ SystrayMenu.Items.push(DebugManager);
+
+ return DebugManager;
+}
+
+});